using Microsoft.Extensions.Configuration; using Phares.Shared; using Serilog; using ShellProgressBar; using View_by_Distance.Delete.By.Distinct.Models; using View_by_Distance.Property.Models; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.Delete.By.Distinct; public class DeleteByDistinct { public DeleteByDistinct(List args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) { if (isSilent) { } if (console is null) { } string searchPattern = "*"; long ticks = DateTime.Now.Ticks; ILogger? log = Log.ForContext(); Dictionary>> fileSizeToCollection = new(); Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; configuration.Update(); log.Information(configuration.RootDirectory); Work(searchPattern, ticks, log, configuration.RootDirectory, nameof(configuration.RootDirectory), options, fileSizeToCollection); Work(searchPattern, ticks, log, appSettings.CompareRootDirectory, nameof(appSettings.CompareRootDirectory), options, fileSizeToCollection); } private static void Work(string searchPattern, long ticks, ILogger log, string directory, string variable, ProgressBarOptions options, Dictionary>> fileSizeToCollection) { string message; string checkName; string deleteLog; int totalSeconds; FileInfo fileInfo; ProgressBar progressBar; List? fileNames; List deletedFiles = new(); List deletedDirectories = new(); Dictionary>? fileTicksToNames; log.Information($"Gathering files from <{directory}>"); (string directory, string[] files)[] leftCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(directory, searchPattern).ToArray(); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); message = $") Looking for duplicates from <{directory}> - {totalSeconds} total second(s)"; progressBar = new(leftCollection.Length, message, options); foreach ((_, string[] files) in leftCollection) { progressBar.Tick(); foreach (string file in files) { fileInfo = new(file); if (!fileSizeToCollection.TryGetValue(fileInfo.Length, out fileTicksToNames)) { fileSizeToCollection.Add(fileInfo.Length, new()); if (!fileSizeToCollection.TryGetValue(fileInfo.Length, out fileTicksToNames)) throw new Exception(); } if (!fileTicksToNames.TryGetValue(fileInfo.LastWriteTime.Ticks, out fileNames)) { fileTicksToNames.Add(fileInfo.LastWriteTime.Ticks, new()); if (!fileTicksToNames.TryGetValue(fileInfo.LastWriteTime.Ticks, out fileNames)) throw new Exception(); } checkName = fileInfo.Name.ToLower(); if (fileNames.Contains(checkName)) deletedFiles.Add(file); else fileNames.Add(checkName); } } deleteLog = $"{ticks}-{variable}-Files.lsv"; File.WriteAllLines(Path.Combine(directory, deleteLog), deletedFiles); if (deletedFiles.Any()) { log.Information($"Ready to delete {deletedFiles.Count} from {variable} file(s)? See <{deleteLog}>"); for (int y = 0; y < int.MaxValue; y++) { log.Information("Press \"Y\" key to delete file(s) or close console to not delete files"); if (Console.ReadKey().Key == ConsoleKey.Y) break; } log.Information(". . ."); foreach (string file in deletedFiles) File.Delete(file); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); message = $") Looking for empty directories from <{directory}> - {totalSeconds} total second(s)"; progressBar.Dispose(); progressBar = new(4, message, options); for (int i = 1; i < 5; i++) { progressBar.Tick(); List check = new(); Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(directory, check); if (!check.Any()) break; deletedDirectories.AddRange(check); } deleteLog = $"{ticks}-{variable}-Directories.lsv"; File.WriteAllLines(Path.Combine(directory, deleteLog), deletedDirectories.Distinct()); } } }