using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using ShellProgressBar; using View_by_Distance.Metadata.Models; using View_by_Distance.Rename.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Stateless.Methods; namespace View_by_Distance.Rename; public class Rename { private readonly AppSettings _AppSettings; private readonly Configuration _Configuration; private readonly IConfigurationRoot _ConfigurationRoot; private readonly MetadataConfiguration _MetadataConfiguration; public Rename(List args, ILogger? logger, IConfigurationRoot configurationRoot, AppSettings appSettings, bool isSilent, IConsole console) { if (isSilent) { } if (args is null) throw new NullReferenceException(nameof(args)); if (console is null) throw new NullReferenceException(nameof(console)); _AppSettings = appSettings; _ConfigurationRoot = configurationRoot; MetadataConfiguration metadataConfiguration = Metadata.Models.Binder.Configuration.Get(configurationRoot); Configuration configuration = Models.Binder.Configuration.Get(configurationRoot, metadataConfiguration); _MetadataConfiguration = metadataConfiguration; _Configuration = configuration; logger?.LogInformation("{RootDirectory}", metadataConfiguration.RootDirectory); MetadataConfiguration.Verify(metadataConfiguration, requireExist: false); Verify(); List linesB = RenameFilesInDirectories(logger); if (linesB.Count != 0) { File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", linesB); _ = IPath.DeleteEmptyDirectories(metadataConfiguration.RootDirectory); } } private void Verify() { if (_AppSettings is null) throw new NullReferenceException(nameof(_AppSettings)); if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); if (_ConfigurationRoot is null) throw new NullReferenceException(nameof(_ConfigurationRoot)); if (_MetadataConfiguration is null) throw new NullReferenceException(nameof(_MetadataConfiguration)); } private List RenameFilesInDirectories(ILogger? logger) { List old = []; List exifDirectories = []; string rootDirectoryFullPath = Path.GetFullPath(_MetadataConfiguration.RootDirectory); ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism }; IEnumerable files = Directory.EnumerateFiles(rootDirectoryFullPath, "*", SearchOption.AllDirectories); A_Metadata metadata = new(_MetadataConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata); ProgressBar progressBar = new(123000, "EnumerateFiles load", new ProgressBarOptions() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }); files.AsParallel().ForAll(A_Metadata.GetResultCollection(metadata, exifDirectories, () => progressBar.Tick())); if (progressBar.CurrentTick != exifDirectories.Count) throw new NotSupportedException(); return old; } }