InPlace
This commit is contained in:
@ -117,26 +117,42 @@ public partial class Rename : IRename, IDisposable
|
||||
|
||||
#pragma warning restore CA1416
|
||||
|
||||
private static void RenameUrl(FilePath filePath)
|
||||
private void NonParallelismAndInPlace(MetadataConfiguration metadataConfiguration, ExifDirectory exifDirectory, FileInfo fileInfo, FilePath filePath, ReadOnlyCollection<FileHolder> sidecarFiles)
|
||||
{
|
||||
FileHolder fileHolder;
|
||||
string[] lines = File.ReadAllLines(filePath.FullName);
|
||||
if (lines.Length == 1)
|
||||
if (exifDirectory.Id is null)
|
||||
throw new NotImplementedException();
|
||||
int i = 0;
|
||||
DateTime? dateTime;
|
||||
const string jpg = ".jpg";
|
||||
const string jpeg = ".jpeg";
|
||||
List<ToDo> toDoCollection = [];
|
||||
ReadOnlyCollection<string> keywords = IMetadata.GetKeywords(exifDirectory);
|
||||
bool hasIgnoreKeyword = metadataConfiguration.IgnoreRulesKeyWords.Any(keywords.Contains);
|
||||
string checkDirectory = Path.Combine(filePath.DirectoryName, filePath.FileNameFirstSegment);
|
||||
string checkFileExtension = filePath.ExtensionLowered == jpeg ? jpg : filePath.ExtensionLowered;
|
||||
string paddedId = IId.GetPaddedId(metadataConfiguration, exifDirectory.Id.Value, hasIgnoreKeyword, i);
|
||||
string checkFile = Path.Combine(checkDirectory, $"{paddedId}{checkFileExtension}");
|
||||
if (File.Exists(checkFile))
|
||||
{
|
||||
fileHolder = FileHolder.Get(lines[0]);
|
||||
if (fileHolder.Exists)
|
||||
{
|
||||
string checkFile;
|
||||
checkFile = IId.GetIgnoreFullPath(filePath, fileHolder);
|
||||
if (lines[0] == checkFile || lines[0].Length != checkFile.Length)
|
||||
throw new NotSupportedException();
|
||||
File.Move(lines[0], checkFile);
|
||||
}
|
||||
File.Delete(filePath.FullName);
|
||||
checkFile = string.Concat(checkFile, ".del");
|
||||
if (File.Exists(checkFile))
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
toDoCollection.Add(new(checkDirectory, filePath, checkFile, JsonFile: false));
|
||||
if (sidecarFiles.Count != 0)
|
||||
{
|
||||
dateTime = IDate.GetDateTimeOriginal(exifDirectory);
|
||||
bool hasDateTimeOriginal = dateTime is not null;
|
||||
dateTime ??= IDate.GetMinimum(exifDirectory);
|
||||
RecordB recordB = new(dateTime.Value, exifDirectory, filePath, sidecarFiles, hasDateTimeOriginal, hasIgnoreKeyword, fileInfo.FullName);
|
||||
toDoCollection.AddRange(GetSidecarFiles(metadataConfiguration, recordB, [], checkDirectory, paddedId));
|
||||
}
|
||||
_ = RenameFilesInDirectories(new(toDoCollection));
|
||||
string jsonFile = Path.Combine(checkDirectory, $"{paddedId}{checkFileExtension}.json");
|
||||
File.Move(fileInfo.FullName, jsonFile);
|
||||
}
|
||||
|
||||
private static List<RecordA> GetRecordACollection(ILogger<Program>? logger, IRename rename, RenameConfiguration renameConfiguration, IEnumerable<string> files, A_Metadata metadata)
|
||||
private List<RecordA> GetRecordACollection(ILogger<Program>? logger, RenameConfiguration renameConfiguration, IRename rename, IEnumerable<string> files, A_Metadata metadata)
|
||||
{
|
||||
List<RecordA> results = [];
|
||||
int index = -1;
|
||||
@ -163,17 +179,14 @@ public partial class Rename : IRename, IDisposable
|
||||
if (renameConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered))
|
||||
continue;
|
||||
filePath = FilePath.Get(renameConfiguration.MetadataConfiguration, fileHolder, index);
|
||||
if (filePath.ExtensionLowered == ".url" && filePath.Id is not null)
|
||||
{
|
||||
RenameUrl(filePath);
|
||||
continue;
|
||||
}
|
||||
if (renameConfiguration.SkipIdFiles && filePath.Id is not null && (filePath.IsIntelligentIdFormat || filePath.SortOrder is not null))
|
||||
continue;
|
||||
if (!renameConfiguration.ForceNewId && filePath.Id is not null)
|
||||
{
|
||||
ffmpegFiles = null;
|
||||
deterministicHashCode = new(null, filePath.Id, null);
|
||||
if (renameConfiguration.InPlace)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -195,12 +208,14 @@ public partial class Rename : IRename, IDisposable
|
||||
logger?.LogWarning("<{filePath}>", filePath.FullName);
|
||||
continue;
|
||||
}
|
||||
results.Add(new(exifDirectory, fileInfo, filePath, new(sidecarFiles)));
|
||||
if (ffmpegFiles is not null)
|
||||
{
|
||||
foreach (string ffmpegFile in ffmpegFiles)
|
||||
File.Delete(ffmpegFile);
|
||||
}
|
||||
if (renameConfiguration.InPlace)
|
||||
NonParallelismAndInPlace(renameConfiguration.MetadataConfiguration, exifDirectory, fileInfo, filePath, new(sidecarFiles));
|
||||
results.Add(new(exifDirectory, fileInfo, filePath, new(sidecarFiles)));
|
||||
}
|
||||
}
|
||||
return results;
|
||||
@ -225,17 +240,18 @@ public partial class Rename : IRename, IDisposable
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private ReadOnlyCollection<RecordB> GetRecordBCollection(ILogger<Program>? logger, IRename rename, AppSettings appSettings, RenameConfiguration renameConfiguration, DirectoryInfo directoryInfo)
|
||||
private ReadOnlyCollection<RecordB> GetRecordBCollection(ILogger<Program>? logger, AppSettings appSettings, IRename rename, DirectoryInfo directoryInfo)
|
||||
{
|
||||
ReadOnlyCollection<RecordB> results;
|
||||
List<RecordA> recordACollection = [];
|
||||
RenameConfiguration renameConfiguration = appSettings.RenameConfiguration;
|
||||
A_Metadata metadata = new(renameConfiguration.MetadataConfiguration);
|
||||
int appSettingsMaxDegreeOfParallelism = appSettings.MaxDegreeOfParallelism;
|
||||
IEnumerable<string> files = appSettingsMaxDegreeOfParallelism == 1 ? Directory.GetFiles(directoryInfo.FullName, "*", SearchOption.AllDirectories) : Directory.EnumerateFiles(directoryInfo.FullName, "*", SearchOption.AllDirectories);
|
||||
int filesCount = appSettingsMaxDegreeOfParallelism == 1 ? files.Count() : 123000;
|
||||
_ProgressBar = new(filesCount, "EnumerateFiles load", new ProgressBarOptions() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true });
|
||||
if (appSettingsMaxDegreeOfParallelism == 1)
|
||||
recordACollection.AddRange(GetRecordACollection(logger, rename, renameConfiguration, files, metadata));
|
||||
recordACollection.AddRange(GetRecordACollection(logger, renameConfiguration, rename, files, metadata));
|
||||
else
|
||||
{
|
||||
List<string> distinct = [];
|
||||
@ -347,9 +363,9 @@ public partial class Rename : IRename, IDisposable
|
||||
const string jpeg = ".jpeg";
|
||||
string jsonFileSubDirectory;
|
||||
bool? directoryCheck = GetDirectoryCheck(renameConfiguration);
|
||||
VerifyIntMinValueLength(renameConfiguration.MetadataConfiguration, recordBCollection);
|
||||
MetadataConfiguration metadataConfiguration = renameConfiguration.MetadataConfiguration;
|
||||
VerifyIntMinValueLength(metadataConfiguration, recordBCollection);
|
||||
bool multipleDirectoriesWithFiles = directoryCheck is not null && directoryCheck.Value;
|
||||
ResultConfiguration resultConfiguration = renameConfiguration.MetadataConfiguration.ResultConfiguration;
|
||||
ReadOnlyCollection<int> ids = identifiers is null ? new([]) : new((from l in identifiers select l.Id).ToArray());
|
||||
ReadOnlyCollection<RecordB> sorted = new((from l in recordBCollection orderby l.DateTime select l).ToArray());
|
||||
for (int i = 0; i < sorted.Count; i++)
|
||||
@ -363,7 +379,7 @@ public partial class Rename : IRename, IDisposable
|
||||
if (string.IsNullOrEmpty(checkDirectory))
|
||||
continue;
|
||||
checkFileExtension = record.FilePath.ExtensionLowered == jpeg ? jpg : record.FilePath.ExtensionLowered;
|
||||
paddedId = IId.GetPaddedId(renameConfiguration.MetadataConfiguration, record.ExifDirectory.Id.Value, record.HasIgnoreKeyword, i);
|
||||
paddedId = IId.GetPaddedId(metadataConfiguration, record.ExifDirectory.Id.Value, record.HasIgnoreKeyword, i);
|
||||
jsonFileSubDirectory = Path.GetDirectoryName(Path.GetDirectoryName(record.JsonFile)) ?? throw new Exception();
|
||||
checkFile = Path.Combine(checkDirectory, $"{paddedId}{checkFileExtension}");
|
||||
if (checkFile == record.FilePath.FullName)
|
||||
@ -374,12 +390,12 @@ public partial class Rename : IRename, IDisposable
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
}
|
||||
(directoryName, _) = IPath.GetDirectoryNameAndIndex(resultConfiguration, record.ExifDirectory.Id.Value);
|
||||
(directoryName, _) = IPath.GetDirectoryNameAndIndex(metadataConfiguration.ResultConfiguration, record.ExifDirectory.Id.Value);
|
||||
jsonFile = Path.Combine(jsonFileSubDirectory, directoryName, $"{record.ExifDirectory.Id.Value}{checkFileExtension}.json");
|
||||
if (record.JsonFile != jsonFile)
|
||||
{
|
||||
fileHolder = FileHolder.Get(record.JsonFile);
|
||||
filePath = FilePath.Get(renameConfiguration.MetadataConfiguration, fileHolder, index: null);
|
||||
filePath = FilePath.Get(metadataConfiguration, fileHolder, index: null);
|
||||
results.Add(new(null, filePath, jsonFile, JsonFile: true));
|
||||
}
|
||||
if (distinct.Contains(checkFile))
|
||||
@ -388,7 +404,7 @@ public partial class Rename : IRename, IDisposable
|
||||
results.Add(new(checkDirectory, record.FilePath, checkFile, JsonFile: false));
|
||||
if (record.SidecarFiles.Count == 0)
|
||||
continue;
|
||||
results.AddRange(GetSidecarFiles(renameConfiguration.MetadataConfiguration, record, distinct, checkDirectory, paddedId));
|
||||
results.AddRange(GetSidecarFiles(metadataConfiguration, record, distinct, checkDirectory, paddedId));
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
@ -464,8 +480,15 @@ public partial class Rename : IRename, IDisposable
|
||||
throw new Exception($"Invalid {nameof(renameConfiguration.RelativePropertyCollectionFile)}");
|
||||
DirectoryInfo directoryInfo = new(Path.GetFullPath(metadataConfiguration.ResultConfiguration.RootDirectory));
|
||||
logger?.LogInformation("{Ticks} {RootDirectory}", ticks, directoryInfo.FullName);
|
||||
ReadOnlyCollection<RecordB> recordBCollection = GetRecordBCollection(logger, rename, appSettings, renameConfiguration, directoryInfo);
|
||||
ReadOnlyCollection<RecordB> recordBCollection = GetRecordBCollection(logger, appSettings, rename, directoryInfo);
|
||||
SaveIdentifiersToDisk(ticks, renameConfiguration, aMetadataCollectionDirectory, recordBCollection);
|
||||
if (renameConfiguration.InPlace)
|
||||
{
|
||||
if (recordBCollection.Count > 0)
|
||||
recordBCollection = new([]);
|
||||
string aMetadataSingletonDirectory = IResult.GetResultsGroupDirectory(metadataConfiguration.ResultConfiguration, nameof(A_Metadata));
|
||||
_ = IPath.DeleteEmptyDirectories(aMetadataSingletonDirectory);
|
||||
}
|
||||
if (!renameConfiguration.OnlySaveIdentifiersToDisk)
|
||||
{
|
||||
ReadOnlyCollection<ToDo> toDoCollection = GetToDoCollection(renameConfiguration, identifiers, recordBCollection);
|
||||
|
Reference in New Issue
Block a user