using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Phares.Shared; using View_by_Distance.Delete.By.Relative.Models; using View_by_Distance.Property.Models; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.Delete.By.Relative; public class DeleteByRelative { public DeleteByRelative(List args, ILogger logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) { if (isSilent) { } if (console is null) { } string relativePath; string checkFileName; string searchPattern = "*"; long ticks = DateTime.Now.Ticks; Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); logger?.LogInformation(configuration.RootDirectory); int length = configuration.RootDirectory.Length; if (string.IsNullOrEmpty(appSettings.CompareRootDirectory) || Path.GetFullPath(appSettings.CompareRootDirectory) == Path.GetFullPath(configuration.RootDirectory)) throw new Exception("Check AppSettings file!"); IEnumerable<(string directory, string[] files)> leftCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(configuration.RootDirectory, searchPattern); List leftRelativeFiles = []; foreach ((_, string[] files) in leftCollection) { foreach (string file in files) { relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(file, length); leftRelativeFiles.Add(Path.GetFullPath(string.Concat(appSettings.CompareRootDirectory, relativePath))); } } List deleteFiles = []; IEnumerable<(string, string[])> rightCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(appSettings.CompareRootDirectory, searchPattern); foreach ((_, string[] files) in rightCollection) { foreach (string file in files) { checkFileName = Path.GetFullPath(file); if (!leftRelativeFiles.Contains(checkFileName)) continue; deleteFiles.Add(checkFileName); } } string? alongSideDirectory; string directoryName = Path.GetFileName(appSettings.CompareRootDirectory); if (Path.GetPathRoot(appSettings.CompareRootDirectory) == appSettings.CompareRootDirectory) alongSideDirectory = appSettings.CompareRootDirectory; else alongSideDirectory = Path.GetDirectoryName(appSettings.CompareRootDirectory); if (alongSideDirectory is null) throw new NullReferenceException(nameof(alongSideDirectory)); string deleteLog = Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.tsv"); File.WriteAllLines(deleteLog, deleteFiles); if (deleteFiles.Count > 0) { logger?.LogInformation($"Ready to delete {deleteFiles.Count} file(s)? See <{deleteLog}>"); for (int y = 0; y < int.MaxValue; y++) { logger?.LogInformation("Press \"Y\" key to delete file(s) or close console to not delete files"); if (Console.ReadKey().Key == ConsoleKey.Y) break; } logger?.LogInformation(". . ."); foreach (string deleteFile in deleteFiles) { File.Delete(deleteFile); checkFileName = $"{deleteFile}.id"; if (!File.Exists(checkFileName)) continue; File.Delete(checkFileName); } for (int i = 1; i < 5; i++) _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(appSettings.CompareRootDirectory); } } }