@page "/Settings/Tools/OrphanedFiles" @using LANCommander.Helpers; @attribute [Authorize(Roles = RoleService.AdministratorRoleName)] @inject ArchiveService ArchiveService @inject StorageLocationService StorageLocationService @inject MediaService MediaService Orphaned Files

These files exist on the server, but aren't linked in the database. Use this tool to identify and delete orphaned files.

@code { ICollection Orphans = new List(); bool Loading = true; readonly Settings Settings = SettingService.GetSettings(); protected override async Task OnInitializedAsync() { await LoadData(); } async Task LoadData() { Loading = true; Orphans = new List(); var storageLocations = await StorageLocationService.GetAsync(); var archives = await ArchiveService.GetAsync(); var archiveFiles = await Task.WhenAll(archives.Select(a => ArchiveService.GetArchiveFileLocationAsync(a))); foreach (var storageLocation in storageLocations.Where(l => l.Type == SDK.Enums.StorageLocationType.Archive)) { var localArchiveFiles = Directory.GetFiles(storageLocation.Path); foreach (var file in localArchiveFiles.Where(f => !archiveFiles.Contains(f))) { var fileInfo = new FileInfo(file); Orphans.Add(new OrphanedFile { Path = file, Size = fileInfo.Length, CreatedOn = fileInfo.CreationTime }); } } var media = await MediaService.GetAsync(); var mediaFiles = media.Select(m => MediaService.GetMediaPath(m)); foreach (var storageLocation in storageLocations.Where(l => l.Type == SDK.Enums.StorageLocationType.Media)) { var localMediaFiles = Directory.GetFiles(storageLocation.Path).Where(f => !f.EndsWith(".Thumb")); foreach (var file in localMediaFiles.Where(f => !mediaFiles.Contains(f))) { var fileInfo = new FileInfo(file); Orphans.Add(new OrphanedFile { Path = file, Size = fileInfo.Length, CreatedOn = fileInfo.CreationTime }); } } Orphans = Orphans.OrderByDescending(f => f.Size).ToList(); Loading = false; } async Task Delete(OrphanedFile file) { Loading = true; FileHelpers.DeleteIfExists(file.Path); await LoadData(); Loading = false; await InvokeAsync(StateHasChanged); } async Task DeleteAll() { Loading = true; foreach (var file in Orphans) { FileHelpers.DeleteIfExists(file.Path); } await LoadData(); Loading = false; await InvokeAsync(StateHasChanged); } }