GetAlternateFileLines

This commit is contained in:
2023-08-13 19:13:52 -07:00
parent 1c5a2f1d93
commit 3c86acdbda
18 changed files with 162 additions and 73 deletions

View File

@ -62,31 +62,59 @@ internal abstract class Container
return filePairs;
}
private static Models.Property? GetProperty(Models.FilePair filePair)
private static string[] GetAlternateFileLines(string? alternateFilesCollectionDirectory, Models.FilePair filePair)
{
Models.Property? property;
string[]? results;
string pathDirectoryName = Path.GetFileName(Path.GetDirectoryName(filePair.Path) ?? filePair.Path);
string? alternateFile = alternateFilesCollectionDirectory is null ? null : Path.Combine(alternateFilesCollectionDirectory, pathDirectoryName, $"{Path.GetFileName(filePair.Path)}.tsv");
if (!File.Exists(alternateFile))
results = Array.Empty<string>();
else
results = File.ReadAllLines(alternateFile);
return results;
}
private static (Models.Property?, string[]) GetProperty(Models.FilePair filePair, string? alternateFilesCollectionDirectory)
{
string[] results;
Models.Property? result;
if (filePair.Match is null)
property = null;
(result, results) = (null, Array.Empty<string>());
else
{
string json = File.ReadAllText(filePair.Match);
if (string.IsNullOrEmpty(json))
property = null;
(result, results) = (null, Array.Empty<string>());
else
property = JsonSerializer.Deserialize<Models.Property>(json);
{
result = JsonSerializer.Deserialize(json, PropertyGenerationContext.Default.Property);
if (result is null)
results = Array.Empty<string>();
else
{
results = alternateFilesCollectionDirectory is null ? Array.Empty<string>() : GetAlternateFileLines(alternateFilesCollectionDirectory, filePair);
if (results.Any(l => l.Contains('!')))
{
if (result.Keywords is null)
result = Models.Property.GetProperty(result, new string[] { "!" });
else
result = Models.Property.GetProperty(result, result.Keywords.Concat(new string[] { "!" }).ToArray());
}
}
}
}
return property;
return (result, results);
}
private static void ParallelFor(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, int length, Models.FilePair filePair, List<FilePair> results)
private static void ParallelFor(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, int rootDirectoryLength, string? alternateFilesCollectionDirectory, Models.FilePair filePair, List<FilePair> results)
{
string fileName;
bool abandoned = false;
Models.FileHolder sourceDirectoryFileHolder;
Models.Property? property = GetProperty(filePair);
Models.FileHolder imageFileInfo = new(filePair.Path);
(Models.Property? property, string[] alternateFileLines) = GetProperty(filePair, alternateFilesCollectionDirectory);
bool? fileSizeChanged = property is not null ? property.FileSize != imageFileInfo.Length : null;
string relativePath = IPath.GetRelativePath(filePair.Path, length, forceExtensionToLower: true);
string relativePath = IPath.GetRelativePath(filePair.Path, rootDirectoryLength, forceExtensionToLower: true);
bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(imageFileInfo.ExtensionLowered);
bool? lastWriteTimeChanged = property is not null ? propertyConfiguration.PropertiesChangedForProperty || property.LastWriteTime != imageFileInfo.LastWriteTime : null;
if (filePair.Match is not null)
@ -104,22 +132,24 @@ internal abstract class Container
File.SetCreationTime(sourceDirectoryFileHolder.FullName, imageFileInfo.LastWriteTime.Value);
File.SetLastWriteTime(sourceDirectoryFileHolder.FullName, sourceDirectoryFileHolder.LastWriteTime.Value);
}
Models.Item item = new(sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, abandoned, fileSizeChanged, lastWriteTimeChanged);
Models.Item item = new(sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, alternateFileLines, abandoned, fileSizeChanged, lastWriteTimeChanged);
lock (results)
results.Add(new(filePair.Path, imageFileInfo.DirectoryName, filePair.IsUnique, filePair.Collection, item));
}
private static List<FilePair> GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, List<Models.FilePair> filePairs)
private static List<FilePair> GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, string extension, List<Models.FilePair> filePairs)
{
List<FilePair> results = new();
int length = propertyConfiguration.RootDirectory.Length;
int maxDegreeOfParallelism = Environment.ProcessorCount;
string? alternateResultAllInOne = !propertyConfiguration.ResultAllInOne.Contains(' ') ? null : propertyConfiguration.ResultAllInOne.Replace(' ', '-');
string? alternateFilesCollectionDirectory = alternateResultAllInOne is null ? null : Path.Combine(Path.GetDirectoryName(filesCollectionDirectory) ?? filesCollectionDirectory, alternateResultAllInOne);
int filesCollectionDirectoryLength = filesCollectionDirectory.Length;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(propertyConfiguration, aPropertySingletonDirectory, extension, length, filePairs[i], results));
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(propertyConfiguration, aPropertySingletonDirectory, extension, filesCollectionDirectoryLength, alternateFilesCollectionDirectory, filePairs[i], results));
return results;
}
private static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string directorySearchFilter, List<string[]> filesCollection)
private static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List<string[]> filesCollection, string directorySearchFilter)
{
List<Models.Container> results = new();
string? directory;
@ -145,7 +175,7 @@ internal abstract class Container
}
}
List<Models.FilePair> filePairs = GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection);
List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, extension, filePairs);
List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, extension, filePairs);
foreach (FilePair filePair in collection)
{
if (filePair.Directory is null)
@ -168,12 +198,12 @@ internal abstract class Container
return (collection.Count, results.ToArray());
}
internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, List<string[]> filesCollection)
internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List<string[]> filesCollection)
{
int count;
Models.Container[] results;
const string directorySearchFilter = "*";
(count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, directorySearchFilter, filesCollection);
(count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, filesCollection, directorySearchFilter);
return (count, results);
}
@ -185,7 +215,7 @@ internal abstract class Container
const string fileSearchFilter = "*";
const string directorySearchFilter = "*";
List<string[]> filesCollection = IDirectory.GetFilesCollection(propertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage);
(count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, directorySearchFilter, filesCollection);
(count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, propertyConfiguration.RootDirectory, filesCollection, directorySearchFilter);
return (count, results);
}

View File

@ -25,10 +25,10 @@ public interface IContainer
static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) =>
Container.GetContainers(propertyConfiguration, aPropertySingletonDirectory);
(int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, List<string[]> filesCollection) =>
GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollection);
static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, List<string[]> filesCollection) =>
Container.GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollection);
(int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List<string[]> filesCollection) =>
GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, filesCollection);
static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List<string[]> filesCollection) =>
Container.GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, filesCollection);
List<int> TestStatic_GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) =>
GetFilteredDistinctIds(propertyConfiguration, containers);

View File

@ -69,19 +69,19 @@ public interface IDirectory
static void MoveFiles(List<string> files, string find, string replace) =>
XDirectory.MoveFiles(files, find, replace);
(string[], List<(Models.FileHolder, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, List<string[]> filesCollection, string[] directories, Action? tick) =>
(string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, List<string[]> filesCollection, string[] directories, Action? tick) =>
GetToDoCollection(propertyConfiguration, filesCollection, directories, tick);
static (string[], List<(Models.FileHolder, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, List<string[]> filesCollection, string[] directories, Action? tick) =>
static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, List<string[]> filesCollection, string[] directories, Action? tick) =>
XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates: false, ifCanUseId: true, filesCollection, directories, tick);
(string[], List<(Models.FileHolder, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List<string[]> filesCollection, string[] directories, Action? tick) =>
(string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List<string[]> filesCollection, string[] directories, Action? tick) =>
GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick);
static (string[], List<(Models.FileHolder, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List<string[]> filesCollection, string[] directories, Action? tick) =>
static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List<string[]> filesCollection, string[] directories, Action? tick) =>
XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick);
List<string> TestStatic_CopyOrMove(List<(Models.FileHolder, string)> toDoCollection, bool move, bool moveBack, Action? tick) =>
List<string> TestStatic_CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick) =>
CopyOrMove(toDoCollection, move, moveBack, tick);
static List<string> CopyOrMove(List<(Models.FileHolder, string)> toDoCollection, bool move, bool moveBack, Action? tick) =>
static List<string> CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick) =>
XDirectory.CopyOrMove(toDoCollection, move, moveBack, tick);
(bool, int?) TestStatic_GetId(int sortOrderOnlyLengthIndex, Models.FileHolder fileHolder) =>

View File

@ -338,9 +338,9 @@ internal abstract partial class XDirectory
return (from l in results orderby l.FileHolder.CreationTime, l.FileHolder.FullName.Length descending select l).ToArray();
}
internal static (string[], List<(Models.FileHolder, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List<string[]> filesCollection, string[] directories, Action? tick)
internal static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List<string[]> filesCollection, string[] directories, Action? tick)
{
List<(Models.FileHolder, string)> results = new();
List<(Models.FileHolder, string?, string)> results = new();
string paddedId;
string checkFile;
string directory;
@ -350,7 +350,10 @@ internal abstract partial class XDirectory
bool wrapped = false;
string directoryName;
bool paddedCheck = false;
string fileDirectoryName;
SortedRecord sortedRecord;
string? alternateCheckFile;
string? alternateDirectory;
Models.FileHolder fileHolder;
List<int> distinctIds = new();
List<string> distinct = new();
@ -358,6 +361,7 @@ internal abstract partial class XDirectory
List<string> distinctDirectories = new();
int intMinValueLength = int.MinValue.ToString().Length;
SortedRecord[] sortedRecords = GetSortedRecords(filesCollection);
string? alternateResultAllInOne = !propertyConfiguration.ResultAllInOne.Contains(' ') ? null : propertyConfiguration.ResultAllInOne.Replace(' ', '-');
for (int i = 0; i < sortedRecords.Length; i++)
{
tick?.Invoke();
@ -365,19 +369,24 @@ internal abstract partial class XDirectory
fileHolder = sortedRecord.FileHolder;
if (fileHolder.Name.EndsWith("len") || fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
continue;
(_, directoryIndex) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.NameWithoutExtension);
directoryName = Path.GetFileName(fileHolder.DirectoryName);
if (directoryName.Length < propertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !fileHolder.Name.StartsWith(directoryName))
(directoryName, directoryIndex) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.NameWithoutExtension);
fileDirectoryName = Path.GetFileName(fileHolder.DirectoryName);
if (fileDirectoryName.Length < propertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !fileHolder.Name.StartsWith(fileDirectoryName))
{
if (wrapped)
continue;
directory = directories[directoryIndex];
if (alternateResultAllInOne is null)
alternateDirectory = null;
else
alternateDirectory = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(directory)) ?? directory, alternateResultAllInOne, directoryName);
}
else
{
if (!wrapped)
wrapped = true;
directory = Path.Combine(directories[directoryIndex], directoryName);
alternateDirectory = null;
directory = Path.Combine(directories[directoryIndex], fileDirectoryName);
}
if (ifCanUseId && sortedRecord.NameWithoutExtensionIsIdFormat && sortedRecord.Id is not null && fileHolder.DirectoryName is not null)
{
@ -401,6 +410,7 @@ internal abstract partial class XDirectory
continue;
if (!copyDuplicates)
continue;
alternateDirectory = null;
for (int j = 1; j < int.MaxValue; j++)
{
fileInfo = new(checkFile);
@ -416,8 +426,9 @@ internal abstract partial class XDirectory
}
if (distinct.Contains(checkFile))
continue;
alternateCheckFile = null;
distinct.Add(checkFile);
results.Add(new(fileHolder, checkFile));
results.Add(new(fileHolder, alternateCheckFile, checkFile));
if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory);
break;
@ -427,7 +438,15 @@ internal abstract partial class XDirectory
distinct.Add(checkFile);
if (sortedRecord.Id is not null)
distinctIds.Add(sortedRecord.Id.Value);
results.Add(new(fileHolder, checkFile));
if (string.IsNullOrEmpty(alternateDirectory))
alternateCheckFile = null;
else
{
alternateCheckFile = Path.Combine(alternateDirectory, $"{sortedRecord.Id}{fileHolder.ExtensionLowered}.tsv");
if (!distinctDirectories.Contains(alternateDirectory))
distinctDirectories.Add(alternateDirectory);
}
results.Add(new(fileHolder, alternateCheckFile, checkFile));
if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory);
}
@ -436,13 +455,15 @@ internal abstract partial class XDirectory
return (distinctDirectories.ToArray(), results);
}
internal static List<string> CopyOrMove(List<(Models.FileHolder, string)> toDoCollection, bool move, bool moveBack, Action? tick)
internal static List<string> CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick)
{
List<string> results = new();
FileInfo fileInfo;
foreach ((Models.FileHolder fileHolder, string to) in toDoCollection)
foreach ((Models.FileHolder fileHolder, string? alternateFile, string to) in toDoCollection)
{
tick?.Invoke();
if (alternateFile is not null)
_ = XPath.WriteAllText(alternateFile, fileHolder.FullName, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
fileInfo = new(to);
if (fileInfo.Exists)
{