@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);
}
}