GetToDoCollection

This commit is contained in:
Mike Phares 2023-07-04 09:04:22 -07:00
parent b331a4d015
commit 79f069445e
10 changed files with 296 additions and 251 deletions

View File

@ -36,15 +36,15 @@ public class CopyDistinct
_Configuration = configuration; _Configuration = configuration;
propertyConfiguration.Update(); propertyConfiguration.Update();
log.Information(propertyConfiguration.RootDirectory); log.Information(propertyConfiguration.RootDirectory);
(bool move, List<string> allFiles, bool anyLenFiles, bool moveBack) = Verify(); (bool move, List<string[]> filesCollection, bool anyLenFiles, bool moveBack) = Verify();
_FileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(propertyConfiguration, appSettings.CopyTo, new string[] { appSettings.ResultDirectoryKey }); _FileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(propertyConfiguration, appSettings.CopyTo, new string[] { appSettings.ResultDirectoryKey });
List<string> lines = CopyDistinctFilesInDirectories(log, move, allFiles, anyLenFiles, moveBack); List<string> lines = CopyDistinctFilesInDirectories(log, move, filesCollection, anyLenFiles, moveBack);
if (lines.Any()) if (lines.Any())
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines); File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines);
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory);
} }
private (bool, List<string>, bool, bool) Verify() private (bool, List<string[]>, bool, bool) Verify()
{ {
if (_AppSettings is null) if (_AppSettings is null)
throw new NullReferenceException(nameof(_AppSettings)); throw new NullReferenceException(nameof(_AppSettings));
@ -64,8 +64,7 @@ public class CopyDistinct
string copyTo = Path.GetFullPath(_AppSettings.CopyTo); string copyTo = Path.GetFullPath(_AppSettings.CopyTo);
bool move = copyTo == _PropertyConfiguration.RootDirectory; bool move = copyTo == _PropertyConfiguration.RootDirectory;
List<string[]> filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter); List<string[]> filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter);
(_, List<string> allFiles) = Get(filesCollection); bool anyLenFiles = filesCollection.Any(l => l.Any(m => m.EndsWith("len")));
bool anyLenFiles = allFiles.Any(l => l.EndsWith("len"));
if (!move) if (!move)
moveBack = false; moveBack = false;
else else
@ -82,198 +81,98 @@ public class CopyDistinct
moveBack = true; moveBack = true;
} }
} }
return (move, allFiles, anyLenFiles, moveBack); return (move, filesCollection, anyLenFiles, moveBack);
} }
private static (List<string>, List<string>) Get(List<string[]> filesCollection) private static (string[], List<(FileHolder, string)>) GetMoveBackToDoCollection(List<string[]> filesCollection)
{ {
List<string> results = new(); List<(FileHolder, string)> results = new();
string? directory;
List<string> directories = new();
foreach (string[] files in filesCollection)
{
if (!files.Any())
continue;
directory = Path.GetDirectoryName(files.First());
if (directory is null)
continue;
if (!directories.Contains(directory))
directories.Add(directory);
results.AddRange(files);
}
return (directories, results);
}
private List<(FileHolder, string, string)> GetToDoCollection(ProgressBar progressBar, FileHolder[] fileHolders)
{
List<(FileHolder, string, string)> results = new();
string checkFile;
string directory;
FileInfo fileInfo;
int directoryIndex;
string directoryName;
bool wrapped = false;
List<string> distinct = new();
FileHolder[] sortedFileHolders = (from l in fileHolders orderby l.LastWriteTime, l.FullName.Length descending select l).ToArray();
string key = string.IsNullOrEmpty(_AppSettings.ResultDirectoryKey) ? _PropertyConfiguration.ResultAllInOne : _AppSettings.ResultDirectoryKey;
foreach (FileHolder fileHolder in sortedFileHolders)
{
progressBar.Tick();
if (fileHolder.Name.EndsWith("len") || fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
continue;
(_, directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.NameWithoutExtension);
directoryName = Path.GetFileName(fileHolder.DirectoryName);
if (directoryName.Length < _PropertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !fileHolder.Name.StartsWith(directoryName))
{
if (wrapped)
continue;
directory = _FileGroups[key][directoryIndex];
}
else
{
if (!wrapped)
wrapped = true;
directory = Path.Combine(_FileGroups[key][directoryIndex], directoryName);
}
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}{fileHolder.ExtensionLowered}");
if (distinct.Contains(checkFile))
{
if (!_AppSettings.CopyDuplicates)
continue;
for (int i = 1; i < int.MaxValue; i++)
{
fileInfo = new(checkFile);
if (!fileInfo.Exists || fileHolder.Length == fileInfo.Length && fileHolder.LastWriteTime == fileInfo.LastWriteTime)
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}dup{fileHolder.ExtensionLowered}");
else
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}why{fileHolder.ExtensionLowered}");
if (distinct.Contains(checkFile))
continue;
distinct.Add(checkFile);
results.Add(new(fileHolder, directory, checkFile));
break;
}
continue;
}
distinct.Add(checkFile);
results.Add(new(fileHolder, directory, checkFile));
}
return results;
}
private static List<(FileHolder, string, string)> GetMoveBackToDoCollection(List<string> files)
{
List<(FileHolder, string, string)> results = new();
string key; string key;
string? value; string? value;
string fileName; string fileName;
files.Reverse();
string? directory; string? directory;
string destinationFile; string destinationFile;
List<string> distinctFound = new(); List<string> distinctFound = new();
List<string> distinctNeeded = new(); List<string> distinctNeeded = new();
List<string> distinctDirectories = new();
Dictionary<string, string> nameToPath = new(); Dictionary<string, string> nameToPath = new();
for (int i = 1; i < 3; i++) for (int i = 1; i < 3; i++)
{
foreach (string[] files in filesCollection)
{
foreach (string file in files.Reverse())
{
fileName = Path.GetFileName(file);
if (fileName.EndsWith("len"))
{
key = fileName[..^3];
destinationFile = file[..^3];
if (nameToPath.ContainsKey(key))
continue;
nameToPath.Add(key, destinationFile);
}
else
{
if (!distinctNeeded.Contains(file))
distinctNeeded.Add(file);
if (!nameToPath.ContainsKey(fileName))
continue;
if (distinctFound.Contains(file))
continue;
distinctFound.Add(file);
}
}
if (distinctNeeded.Count != distinctFound.Count)
continue;
break;
}
}
foreach (string[] files in filesCollection)
{ {
foreach (string file in files) foreach (string file in files)
{ {
// if (distinctNeeded.Count != distinctFound.Count)
// continue;
fileName = Path.GetFileName(file); fileName = Path.GetFileName(file);
if (fileName.EndsWith("len")) if (fileName.EndsWith("len"))
{
key = fileName[..^3];
destinationFile = file[..^3];
if (nameToPath.ContainsKey(key))
continue;
nameToPath.Add(key, destinationFile);
}
else
{
if (!distinctNeeded.Contains(file))
distinctNeeded.Add(file);
if (!nameToPath.ContainsKey(fileName))
continue;
if (distinctFound.Contains(file))
continue;
distinctFound.Add(file);
}
}
if (distinctNeeded.Count != distinctFound.Count)
continue;
break;
}
foreach (string file in files)
{
// if (distinctNeeded.Count != distinctFound.Count)
// continue;
fileName = Path.GetFileName(file);
if (fileName.EndsWith("len"))
continue;
if (!nameToPath.TryGetValue(fileName, out value))
continue;
directory = Path.GetDirectoryName(value);
if (string.IsNullOrEmpty(directory))
continue;
results.Add(new(new(file), directory, value));
}
return results;
}
private static List<string> CopyOrMove(ProgressBar progressBar, List<(FileHolder, string, string)> toDoCollection, bool move, bool moveBack)
{
List<string> results = new();
FileInfo fileInfo;
foreach ((FileHolder fileHolder, string _, string to) in toDoCollection)
{
progressBar.Tick();
fileInfo = new(to);
if (fileInfo.Exists)
{
if (fileHolder.Length != fileInfo.Length || fileHolder.LastWriteTime != fileInfo.LastWriteTime)
fileInfo.Delete();
else
continue; continue;
if (!nameToPath.TryGetValue(fileName, out value))
continue;
directory = Path.GetDirectoryName(value);
if (string.IsNullOrEmpty(directory))
continue;
results.Add(new(new(file), value));
if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory);
} }
results.Add(fileHolder.NameWithoutExtension);
try
{
if (move || moveBack)
File.Move(fileHolder.FullName, to);
else
File.Copy(fileHolder.FullName, to);
}
catch (Exception) { }
} }
return results; return (distinctDirectories.ToArray(), results);
} }
private List<string> CopyDistinctFilesInDirectories(ILogger log, bool move, List<string> allFiles, bool anyLenFiles, bool moveBack) private List<string> CopyDistinctFilesInDirectories(ILogger log, bool move, List<string[]> filesCollection, bool anyLenFiles, bool moveBack)
{ {
List<string> results = new(); List<string> results = new();
ProgressBar progressBar; ProgressBar progressBar;
string[] distinctDirectories;
ConsoleKey? consoleKey = null; ConsoleKey? consoleKey = null;
string message = nameof(CopyDistinct); string message = nameof(CopyDistinct);
List<string> distinctDirectories = new(); List<(FileHolder, string)> toDoCollection;
List<(FileHolder, string, string)> toDoCollection; int count = filesCollection.Select(l => l.Length).Sum();
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
if (moveBack) if (moveBack)
{ {
if (!anyLenFiles) if (!anyLenFiles)
throw new NotSupportedException(); throw new NotSupportedException();
toDoCollection = GetMoveBackToDoCollection(allFiles); (distinctDirectories, toDoCollection) = GetMoveBackToDoCollection(filesCollection);
} }
else else
{ {
progressBar = new(allFiles.Count, message, options); progressBar = new(count, message, options);
FileHolder[] fileHolders = (from l in allFiles select new FileHolder(l)).ToArray(); string key = string.IsNullOrEmpty(_AppSettings.ResultDirectoryKey) ? _PropertyConfiguration.ResultAllInOne : _AppSettings.ResultDirectoryKey;
toDoCollection = GetToDoCollection(progressBar, fileHolders); string[] directories = _FileGroups[key];
(distinctDirectories, toDoCollection) = Shared.Models.Stateless.Methods.IDirectory.GetToDoCollection(_PropertyConfiguration, _AppSettings.CopyDuplicates, filesCollection, directories, () => progressBar.Tick());
progressBar.Dispose(); progressBar.Dispose();
} }
foreach ((FileHolder fileHolder, string directory, string to) in toDoCollection)
{
if (distinctDirectories.Contains(directory))
continue;
distinctDirectories.Add(directory);
}
foreach (string distinctDirectory in distinctDirectories) foreach (string distinctDirectory in distinctDirectories)
{ {
if (!Directory.Exists(distinctDirectory)) if (!Directory.Exists(distinctDirectory))
@ -307,8 +206,8 @@ public class CopyDistinct
} }
else else
{ {
progressBar = new(allFiles.Count, message, options); progressBar = new(count, message, options);
results.AddRange(CopyOrMove(progressBar, toDoCollection, move, moveBack)); results.AddRange(Shared.Models.Stateless.Methods.IDirectory.CopyOrMove(toDoCollection, move, moveBack, () => progressBar.Tick()));
progressBar.Dispose(); progressBar.Dispose();
if (move || moveBack) if (move || moveBack)
log.Information("Done moving"); log.Information("Done moving");

View File

@ -392,6 +392,7 @@ public partial class DlibDotNet
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers,
MapLogic mapLogic, MapLogic mapLogic,
string outputResolution, string outputResolution,
bool outputResolutionHasNumber,
string cResultsFullGroupDirectory, string cResultsFullGroupDirectory,
string dResultsFullGroupDirectory, string dResultsFullGroupDirectory,
string d2ResultsFullGroupDirectory, string d2ResultsFullGroupDirectory,
@ -412,7 +413,7 @@ public partial class DlibDotNet
List<string> parseExceptions = new(); List<string> parseExceptions = new();
List<Tuple<string, DateTime>> subFileTuples = new(); List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(item); FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
if (item.Property is null || item.Property.Id is null || item.Any()) if (item.Property is null || item.Property.Id is null || item.Any())
{ {
LogItemPropertyIsNull(item); LogItemPropertyIsNull(item);
@ -513,6 +514,7 @@ public partial class DlibDotNet
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers,
MapLogic mapLogic, MapLogic mapLogic,
string outputResolution, string outputResolution,
bool outputResolutionHasNumber,
string cResultsFullGroupDirectory, string cResultsFullGroupDirectory,
string dResultsFullGroupDirectory, string dResultsFullGroupDirectory,
string d2ResultsFullGroupDirectory, string d2ResultsFullGroupDirectory,
@ -542,6 +544,7 @@ public partial class DlibDotNet
idToLocationContainers, idToLocationContainers,
mapLogic, mapLogic,
outputResolution, outputResolution,
outputResolutionHasNumber,
cResultsFullGroupDirectory, cResultsFullGroupDirectory,
dResultsFullGroupDirectory, dResultsFullGroupDirectory,
d2ResultsFullGroupDirectory, d2ResultsFullGroupDirectory,
@ -665,6 +668,7 @@ public partial class DlibDotNet
int exceptionCount; int exceptionCount;
Container container; Container container;
Item[] filteredItems; Item[] filteredItems;
bool outputResolutionHasNumber;
bool anyNullOrNoIsUniqueFileName; bool anyNullOrNoIsUniqueFileName;
string cResultsFullGroupDirectory; string cResultsFullGroupDirectory;
string dResultsFullGroupDirectory; string dResultsFullGroupDirectory;
@ -677,6 +681,7 @@ public partial class DlibDotNet
foreach (string outputResolution in _Configuration.OutputResolutions) foreach (string outputResolution in _Configuration.OutputResolutions)
{ {
total = 0; total = 0;
outputResolutionHasNumber = outputResolution.Any(l => char.IsNumber(l));
(cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); (cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);
_Faces.Update(dResultsFullGroupDirectory); _Faces.Update(dResultsFullGroupDirectory);
_Resize.Update(cResultsFullGroupDirectory); _Resize.Update(cResultsFullGroupDirectory);
@ -697,13 +702,15 @@ public partial class DlibDotNet
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
message = $"{i + 1:000} [{filteredItems.Length:000}] / {containersLength:000} - {total} / {t} total - {totalSeconds} total second(s) - {outputResolution} - {container.SourceDirectory}"; message = $"{i + 1:000} [{filteredItems.Length:000}] / {containersLength:000} - {total} / {t} total - {totalSeconds} total second(s) - {outputResolution} - {container.SourceDirectory}";
propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, container.SourceDirectory, anyNullOrNoIsUniqueFileName); propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, container.SourceDirectory, anyNullOrNoIsUniqueFileName);
_Resize.SetAngleBracketCollection(cResultsFullGroupDirectory, container.SourceDirectory); if (outputResolutionHasNumber)
_Resize.SetAngleBracketCollection(cResultsFullGroupDirectory, container.SourceDirectory);
exceptionCount = FullParallelWork(maxDegreeOfParallelism, exceptionCount = FullParallelWork(maxDegreeOfParallelism,
propertyLogic, propertyLogic,
metadata, metadata,
idToLocationContainers, idToLocationContainers,
mapLogic, mapLogic,
outputResolution, outputResolution,
outputResolutionHasNumber,
cResultsFullGroupDirectory, cResultsFullGroupDirectory,
dResultsFullGroupDirectory, dResultsFullGroupDirectory,
d2ResultsFullGroupDirectory, d2ResultsFullGroupDirectory,
@ -815,13 +822,17 @@ public partial class DlibDotNet
SaveFaceDistances(ticks, mapLogic, distinctFilteredFaces, distinctFilteredMappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, dFacesCollectionDirectory, idToWholePercentagesToMapping); SaveFaceDistances(ticks, mapLogic, distinctFilteredFaces, distinctFilteredMappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, dFacesCollectionDirectory, idToWholePercentagesToMapping);
} }
private string SaveUrlAndGetNewRootDirectory(Container container) private string SaveUrlAndGetNewRootDirectory(string[] files)
{ {
string result;
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
string? result = Path.GetDirectoryName(Path.GetDirectoryName(container.SourceDirectory)) ?? throw new Exception(); if (!files.Any())
throw new NotSupportedException();
string? sourceDirectory = Path.GetDirectoryName(files.First());
if (string.IsNullOrEmpty(sourceDirectory))
throw new NotSupportedException();
Uri uri; Uri uri;
Item item;
string? line; string? line;
string fileName; string fileName;
Task<byte[]> task; Task<byte[]> task;
@ -829,9 +840,10 @@ public partial class DlibDotNet
FileHolder fileHolder; FileHolder fileHolder;
string extensionLowered; string extensionLowered;
string sourceDirectoryFile; string sourceDirectoryFile;
int length = result.Length;
HttpClient httpClient = new(); HttpClient httpClient = new();
bool isValidImageFormatExtension; bool isValidImageFormatExtension;
result = Path.GetDirectoryName(Path.GetDirectoryName(sourceDirectory)) ?? throw new NotSupportedException();
int length = result.Length;
for (int y = 0; y < int.MaxValue; y++) for (int y = 0; y < int.MaxValue; y++)
{ {
_Log.Information("Enter fileNameToCollection url for fileNameToCollection image"); _Log.Information("Enter fileNameToCollection url for fileNameToCollection image");
@ -843,14 +855,14 @@ public partial class DlibDotNet
continue; continue;
task = httpClient.GetByteArrayAsync(uri); task = httpClient.GetByteArrayAsync(uri);
fileName = Path.GetFileName(uri.LocalPath); fileName = Path.GetFileName(uri.LocalPath);
sourceDirectoryFile = Path.Combine(container.SourceDirectory, fileName); sourceDirectoryFile = Path.Combine(sourceDirectory, fileName);
File.WriteAllBytes(sourceDirectoryFile, task.Result); File.WriteAllBytes(sourceDirectoryFile, task.Result);
extensionLowered = Path.GetExtension(uri.LocalPath); extensionLowered = Path.GetExtension(uri.LocalPath);
relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length, forceExtensionToLower: true); relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length, forceExtensionToLower: true);
isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(extensionLowered); isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(extensionLowered);
fileHolder = new(sourceDirectoryFile); fileHolder = new(sourceDirectoryFile);
item = new(fileHolder, relativePath, isValidImageFormatExtension); _ = new Item(fileHolder, relativePath, isValidImageFormatExtension);
container.Items.Add(item); // container.Items.Add(item);
} }
_Log.Information(". . ."); _Log.Information(". . .");
return result; return result;
@ -1125,6 +1137,7 @@ public partial class DlibDotNet
private void Search(long ticks, string argZero, string propertyRoot) private void Search(long ticks, string argZero, string propertyRoot)
{ {
int t; int t;
string message;
Container[] containers; Container[] containers;
A_Property propertyLogic; A_Property propertyLogic;
string eDistanceContentDirectory; string eDistanceContentDirectory;
@ -1136,31 +1149,22 @@ public partial class DlibDotNet
string c2ResultsFullGroupDirectory; string c2ResultsFullGroupDirectory;
string d2ResultsFullGroupDirectory; string d2ResultsFullGroupDirectory;
string fPhotoPrismContentDirectory; string fPhotoPrismContentDirectory;
const string fileSearchFilter = "*";
string fPhotoPrismSingletonDirectory; string fPhotoPrismSingletonDirectory;
const string directorySearchFilter = "*";
Dictionary<long, List<int>> personKeyToIds; Dictionary<long, List<int>> personKeyToIds;
Dictionary<int, List<MappingFromPhotoPrism>> fileNameToCollection; Dictionary<int, List<MappingFromPhotoPrism>> fileNameToCollection;
(aResultsFullGroupDirectory, bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); (aResultsFullGroupDirectory, bResultsFullGroupDirectory) = GetResultsFullGroupDirectories();
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "{}"); string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "{}");
a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "([])"); a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "([])");
eDistanceContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(E_Distance), "()"); eDistanceContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(E_Distance), "()");
fPhotoPrismContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), "()"); fPhotoPrismContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), "()");
fPhotoPrismSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), "{}"); fPhotoPrismSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), "{}");
propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory); propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory);
MapLogic mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, new(_PersonContainers), ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory); List<string[]> filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_Configuration.PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter);
_PersonContainers.AddRange(Shared.Models.Stateless.Methods.IPersonContainer.GetNonSpecificPeopleCollection(_Configuration.MappingDefaultName, _Configuration.PersonBirthdayFirstYear, _Configuration.PersonCharacters.ToArray(), _PersonContainers, ticks)); int count = filesCollection.Select(l => l.Length).Sum();
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); if (filesCollection.Count == 1)
string message = $") Building Container(s) - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using (ProgressBar progressBar = new(2, message, options))
{
progressBar.Tick();
string aPropertySingletonDirectory = Path.Combine(aResultsFullGroupDirectory, "{}");
if (!Directory.Exists(aPropertySingletonDirectory))
_ = Directory.CreateDirectory(aPropertySingletonDirectory);
(t, containers) = Shared.Models.Stateless.Methods.IContainer.GetContainers(_Configuration.PropertyConfiguration, aPropertySingletonDirectory);
progressBar.Tick();
}
if (containers.Length == 1)
{ {
string resultsGroupDirectory; string resultsGroupDirectory;
a2PeopleContentDirectory = null; a2PeopleContentDirectory = null;
@ -1172,14 +1176,46 @@ public partial class DlibDotNet
resultsGroupDirectory = Property.Models.Stateless.IResult.GetResultsGroupDirectory(_Configuration.PropertyConfiguration, string.Empty, create: true); resultsGroupDirectory = Property.Models.Stateless.IResult.GetResultsGroupDirectory(_Configuration.PropertyConfiguration, string.Empty, create: true);
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(resultsGroupDirectory); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(resultsGroupDirectory);
} }
argZero = SaveUrlAndGetNewRootDirectory(containers[0]); argZero = SaveUrlAndGetNewRootDirectory(filesCollection.First());
_Configuration.PropertyConfiguration.ChangeRootDirectory(argZero); _Configuration.PropertyConfiguration.ChangeRootDirectory(argZero);
(aResultsFullGroupDirectory, bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); (aResultsFullGroupDirectory, bResultsFullGroupDirectory) = GetResultsFullGroupDirectories();
propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(_Configuration.PropertyConfiguration, nameof(A_Property), create: false); propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(_Configuration.PropertyConfiguration, nameof(A_Property), create: false);
propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory); propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory);
} }
TimeSpan eLastWriteTimeTimeSpan = new(ticks - new DirectoryInfo(eDistanceContentDirectory).LastWriteTime.Ticks);
foreach (string outputResolution in _Configuration.OutputResolutions)
{
if (outputResolution.Any(l => char.IsNumber(l)))
continue;
if (eLastWriteTimeTimeSpan.TotalDays < 1)
break;
ProgressBar progressBar;
(cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution);
IReadOnlyDictionary<string, string[]> fileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, new string[] { _Configuration.PropertyConfiguration.ResultContent });
message = $") Selecting for ## pattern directory - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
progressBar = new(count, message, options);
(string[] distinctDirectories, List<(FileHolder, string)> toDoCollection) = Shared.Models.Stateless.Methods.IDirectory.GetToDoCollection(_Configuration.PropertyConfiguration, copyDuplicates: false, filesCollection, fileGroups[_Configuration.PropertyConfiguration.ResultContent], () => progressBar.Tick());
progressBar.Dispose();
message = $") Copying to ## pattern directory - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
progressBar = new(count, message, options);
_ = Shared.Models.Stateless.Methods.IDirectory.CopyOrMove(toDoCollection, move: false, moveBack: false, () => progressBar.Tick());
progressBar.Dispose();
break;
}
message = $") Building Container(s) - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
using (ProgressBar progressBar = new(2, message, options))
{
progressBar.Tick();
string aPropertySingletonDirectory = Path.Combine(aResultsFullGroupDirectory, "{}");
if (!Directory.Exists(aPropertySingletonDirectory))
_ = Directory.CreateDirectory(aPropertySingletonDirectory);
(t, containers) = Shared.Models.Stateless.Methods.IContainer.GetContainers(_Configuration.PropertyConfiguration, aPropertySingletonDirectory, filesCollection);
progressBar.Tick();
}
fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory); fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory);
B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory); B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory);
MapLogic mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, new(_PersonContainers), ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
_PersonContainers.AddRange(Shared.Models.Stateless.Methods.IPersonContainer.GetNonSpecificPeopleCollection(_Configuration.MappingDefaultName, _Configuration.PersonBirthdayFirstYear, _Configuration.PersonCharacters.ToArray(), _PersonContainers, ticks));
containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers); containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers);
personKeyToIds = mapLogic.GetPersonKeyToIds(); personKeyToIds = mapLogic.GetPersonKeyToIds();
if (!string.IsNullOrEmpty(_Configuration.GenealogicalDataCommunicationFile) && !string.IsNullOrEmpty(a2PeopleContentDirectory) && _GenealogicalDataCommunicationHeaderLines is not null && _GenealogicalDataCommunicationFooterLines is not null && _GenealogicalDataCommunicationHeaderLines.Any() && _GenealogicalDataCommunicationFooterLines.Any()) if (!string.IsNullOrEmpty(_Configuration.GenealogicalDataCommunicationFile) && !string.IsNullOrEmpty(a2PeopleContentDirectory) && _GenealogicalDataCommunicationHeaderLines is not null && _GenealogicalDataCommunicationFooterLines is not null && _GenealogicalDataCommunicationHeaderLines.Any() && _GenealogicalDataCommunicationFooterLines.Any())

View File

@ -419,9 +419,16 @@ public class C_Resize
return results; return results;
} }
public FileHolder GetResizedFileHolder(Item item) public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber)
{ {
FileHolder result = new(Path.Combine(AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), Path.GetFileName(item.ImageFileHolder.FullName))); FileHolder result;
if (outputResolutionHasNumber)
result = new(Path.Combine(AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), Path.GetFileName(item.ImageFileHolder.FullName)));
else
{
(string directoryName, _) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, item.ImageFileHolder.Name);
result = new(Path.Combine(cResultsFullGroupDirectory, _PropertyConfiguration.ResultContent, _PropertyConfiguration.ResultAllInOne, directoryName, Path.GetFileName(item.ImageFileHolder.FullName)));
}
return result; return result;
} }

View File

@ -61,53 +61,39 @@ public class SetCreatedDate
{ } { }
} }
private static (List<string>, List<string>) Get(List<string[]> filesCollection) private List<(FileHolder, DateTime)> GetToDoCollection(ProgressBar progressBar, List<string[]> filesCollection)
{
List<string> results = new();
string? directory;
List<string> directories = new();
foreach (string[] files in filesCollection)
{
if (!files.Any())
continue;
directory = Path.GetDirectoryName(files.First());
if (directory is null)
continue;
if (!directories.Contains(directory))
directories.Add(directory);
results.AddRange(files);
}
return (directories, results);
}
private List<(FileHolder, DateTime)> GetToDoCollection(ProgressBar progressBar, FileHolder[] fileHolders)
{ {
List<(FileHolder, DateTime)> results = new(); List<(FileHolder, DateTime)> results = new();
int? id; int? id;
string? message; string? message;
DateTime? dateTime; DateTime? dateTime;
FileHolder fileHolder;
DateTime?[] dateTimes; DateTime?[] dateTimes;
bool isIgnoreExtension; bool isIgnoreExtension;
DateTime? dateTimeOriginal; DateTime? dateTimeOriginal;
bool isValidImageFormatExtension; bool isValidImageFormatExtension;
foreach (FileHolder fileHolder in fileHolders) foreach (string[] files in filesCollection)
{ {
progressBar.Tick(); foreach (string file in files)
if (fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null) {
continue; progressBar.Tick();
if (_PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered)) fileHolder = new(file);
continue; if (fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered); continue;
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered); if (_PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered))
if (isIgnoreExtension || !isValidImageFormatExtension) continue;
continue; isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
(dateTimeOriginal, dateTimes, id, message) = Shared.Models.Stateless.Methods.IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension, _PropertyConfiguration.PopulatePropertyId); isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
dateTime = dateTimeOriginal is not null ? dateTimeOriginal : dateTime = dateTimes.Min(); if (isIgnoreExtension || !isValidImageFormatExtension)
if (dateTime is null) continue;
continue; (dateTimeOriginal, dateTimes, id, message) = Shared.Models.Stateless.Methods.IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension, _PropertyConfiguration.PopulatePropertyId);
if (dateTime.Value == fileHolder.CreationTime) dateTime = dateTimeOriginal is not null ? dateTimeOriginal : dateTime = dateTimes.Min();
continue; if (dateTime is null)
results.Add((fileHolder, dateTime.Value)); continue;
if (dateTime.Value == fileHolder.CreationTime)
continue;
results.Add((fileHolder, dateTime.Value));
}
} }
return results; return results;
} }
@ -135,11 +121,10 @@ public class SetCreatedDate
string message = nameof(SetCreatedDate); string message = nameof(SetCreatedDate);
const string directorySearchFilter = "*"; const string directorySearchFilter = "*";
List<string[]> filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter); List<string[]> filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter);
(_, List<string> allFiles) = Get(filesCollection); int count = filesCollection.Select(l => l.Length).Sum();
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
progressBar = new(allFiles.Count, message, options); progressBar = new(count, message, options);
FileHolder[] fileHolders = (from l in allFiles select new FileHolder(l)).ToArray(); List<(FileHolder, DateTime)> toDoCollection = GetToDoCollection(progressBar, filesCollection);
List<(FileHolder, DateTime)> toDoCollection = GetToDoCollection(progressBar, fileHolders);
progressBar.Dispose(); progressBar.Dispose();
log.Information($"Ready to set created date {toDoCollection.Count} file(s)?"); log.Information($"Ready to set created date {toDoCollection.Count} file(s)?");
for (int y = 0; y < int.MaxValue; y++) for (int y = 0; y < int.MaxValue; y++)
@ -154,7 +139,7 @@ public class SetCreatedDate
log.Information("Nothing set!"); log.Information("Nothing set!");
else else
{ {
progressBar = new(allFiles.Count, message, options); progressBar = new(count, message, options);
results.AddRange(SetCreatedDateForeach(progressBar, toDoCollection)); results.AddRange(SetCreatedDateForeach(progressBar, toDoCollection));
progressBar.Dispose(); progressBar.Dispose();
log.Information("Done setting created date"); log.Information("Done setting created date");

View File

@ -158,20 +158,7 @@ internal abstract class Container
return results; return results;
} }
private static void CreateShell(Properties.IPropertyConfiguration propertyConfiguration, List<string> directories) private static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string directorySearchFilter, List<string[]> filesCollection)
{
string checkDirectory;
int startIndex = propertyConfiguration.RootDirectory.Length;
foreach (string directory in directories)
{
checkDirectory = directory.Insert(startIndex, "-Shell");
if (Directory.Exists(checkDirectory))
continue;
_ = Directory.CreateDirectory(checkDirectory);
}
}
internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory)
{ {
List<Models.Container> results = new(); List<Models.Container> results = new();
string? directory; string? directory;
@ -179,10 +166,7 @@ internal abstract class Container
Models.Container container; Models.Container container;
const string extension = ".json"; const string extension = ".json";
List<string> directories = new(); List<string> directories = new();
const string fileSearchFilter = "*";
const string directorySearchFilter = "*";
Dictionary<string, List<Models.Item>> directoryToItems = new(); Dictionary<string, List<Models.Item>> directoryToItems = new();
List<string[]> filesCollection = IDirectory.GetFilesCollection(propertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter);
foreach (string[] files in filesCollection) foreach (string[] files in filesCollection)
{ {
if (!files.Any()) if (!files.Any())
@ -199,7 +183,6 @@ internal abstract class Container
throw new Exception(); throw new Exception();
} }
} }
CreateShell(propertyConfiguration, directories);
List<Models.FilePair> filePairs = GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection); List<Models.FilePair> filePairs = GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection);
List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, extension, filePairs); List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, extension, filePairs);
foreach (FilePair filePair in collection) foreach (FilePair filePair in collection)
@ -224,6 +207,26 @@ internal abstract class Container
return (collection.Count, results.ToArray()); return (collection.Count, results.ToArray());
} }
internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, List<string[]> filesCollection)
{
int count;
Models.Container[] results;
const string directorySearchFilter = "*";
(count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, directorySearchFilter, filesCollection);
return (count, results);
}
internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory)
{
int count;
Models.Container[] results;
const string fileSearchFilter = "*";
const string directorySearchFilter = "*";
List<string[]> filesCollection = IDirectory.GetFilesCollection(propertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter);
(count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, directorySearchFilter, filesCollection);
return (count, results);
}
internal static List<int> GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) internal static List<int> GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers)
{ {
List<int> results = new(); List<int> results = new();

View File

@ -33,6 +33,11 @@ public interface IContainer
static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) => static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) =>
Container.GetContainers(propertyConfiguration, 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);
List<int> TestStatic_GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) => List<int> TestStatic_GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) =>
GetFilteredDistinctIds(propertyConfiguration, containers); GetFilteredDistinctIds(propertyConfiguration, containers);
static List<int> GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) => static List<int> GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) =>

View File

@ -43,4 +43,14 @@ public interface IDirectory
static void MoveFiles(List<string> files, string find, string replace) => static void MoveFiles(List<string> files, string find, string replace) =>
XDirectory.MoveFiles(files, find, replace); XDirectory.MoveFiles(files, find, replace);
(string[], List<(Models.FileHolder, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, List<string[]> filesCollection, string[] directories, Action? tick) =>
GetToDoCollection(propertyConfiguration, copyDuplicates, filesCollection, directories, tick);
static (string[], List<(Models.FileHolder, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, List<string[]> filesCollection, string[] directories, Action? tick) =>
XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates, filesCollection, directories, tick);
void TestStatic_CopyOrMove(List<(Models.FileHolder, 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) =>
XDirectory.CopyOrMove(toDoCollection, move, moveBack, tick);
} }

View File

@ -278,4 +278,102 @@ internal abstract partial class XDirectory
} }
} }
private static List<Models.FileHolder> GetFileHolders(List<string[]> filesCollection)
{
List<Models.FileHolder> results = new();
foreach (string[] files in filesCollection)
results.AddRange(files.Select(l => new Models.FileHolder(l)));
return results;
}
internal static (string[], List<(Models.FileHolder, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, List<string[]> filesCollection, string[] directories, Action? tick)
{
List<(Models.FileHolder, string)> results = new();
string checkFile;
string directory;
FileInfo fileInfo;
int directoryIndex;
string directoryName;
bool wrapped = false;
List<string> distinct = new();
List<string> distinctDirectories = new();
List<Models.FileHolder> fileHolders = GetFileHolders(filesCollection);
Models.FileHolder[] sortedFileHolders = (from l in fileHolders orderby l.LastWriteTime, l.FullName.Length descending select l).ToArray();
foreach (Models.FileHolder fileHolder in sortedFileHolders)
{
tick?.Invoke();
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))
{
if (wrapped)
continue;
directory = directories[directoryIndex];
}
else
{
if (!wrapped)
wrapped = true;
directory = Path.Combine(directories[directoryIndex], directoryName);
}
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}{fileHolder.ExtensionLowered}");
if (distinct.Contains(checkFile))
{
if (!copyDuplicates)
continue;
for (int i = 1; i < int.MaxValue; i++)
{
fileInfo = new(checkFile);
if (!fileInfo.Exists || fileHolder.Length == fileInfo.Length && fileHolder.LastWriteTime == fileInfo.LastWriteTime)
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}dup{fileHolder.ExtensionLowered}");
else
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}why{fileHolder.ExtensionLowered}");
if (distinct.Contains(checkFile))
continue;
distinct.Add(checkFile);
results.Add(new(fileHolder, checkFile));
if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory);
break;
}
continue;
}
distinct.Add(checkFile);
results.Add(new(fileHolder, checkFile));
if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory);
}
return (distinctDirectories.ToArray(), results);
}
internal static List<string> CopyOrMove(List<(Models.FileHolder, string)> toDoCollection, bool move, bool moveBack, Action? tick)
{
List<string> results = new();
FileInfo fileInfo;
foreach ((Models.FileHolder fileHolder, string to) in toDoCollection)
{
tick?.Invoke();
fileInfo = new(to);
if (fileInfo.Exists)
{
if (fileHolder.Length != fileInfo.Length || fileHolder.LastWriteTime != fileInfo.LastWriteTime)
fileInfo.Delete();
else
continue;
}
results.Add(fileHolder.NameWithoutExtension);
try
{
if (move || moveBack)
File.Move(fileHolder.FullName, to);
else
File.Copy(fileHolder.FullName, to);
}
catch (Exception) { }
}
return results;
}
} }

View File

@ -144,6 +144,7 @@ public class UnitTestResize
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
int length = _PropertyConfiguration.RootDirectory.Length; int length = _PropertyConfiguration.RootDirectory.Length;
string outputResolution = _Configuration.OutputResolutions[0]; string outputResolution = _Configuration.OutputResolutions[0];
bool outputResolutionHasNumber = outputResolution.Any(l => char.IsNumber(l));
(string cResultsFullGroupDirectory, _, _) = GetResultsFullGroupDirectories(outputResolution); (string cResultsFullGroupDirectory, _, _) = GetResultsFullGroupDirectories(outputResolution);
(string aResultsFullGroupDirectory, string bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); (string aResultsFullGroupDirectory, string bResultsFullGroupDirectory) = GetResultsFullGroupDirectories();
_Logger.Information(_Configuration.ModelDirectory); _Logger.Information(_Configuration.ModelDirectory);
@ -174,7 +175,7 @@ public class UnitTestResize
} }
if (property is null || item.Property is null) if (property is null || item.Property is null)
throw new NullReferenceException(nameof(property)); throw new NullReferenceException(nameof(property));
resizedFileHolder = resize.GetResizedFileHolder(item); resizedFileHolder = resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
Shared.Models.Methods.IBlurHasher blurHasher = new BlurHash.Models.C2_BlurHasher(_Configuration.PropertyConfiguration, resultsFullGroupDirectory: null); Shared.Models.Methods.IBlurHasher blurHasher = new BlurHash.Models.C2_BlurHasher(_Configuration.PropertyConfiguration, resultsFullGroupDirectory: null);
_ = blurHasher.Encode(resizedFileHolder); _ = blurHasher.Encode(resizedFileHolder);
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);

View File

@ -218,6 +218,7 @@ public class UnitTestFace
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
int length = _PropertyConfiguration.RootDirectory.Length; int length = _PropertyConfiguration.RootDirectory.Length;
string outputResolution = _Configuration.OutputResolutions[0]; string outputResolution = _Configuration.OutputResolutions[0];
bool outputResolutionHasNumber = outputResolution.Any(l => char.IsNumber(l));
(string cResultsFullGroupDirectory, _, _) = GetResultsFullGroupDirectories(outputResolution); (string cResultsFullGroupDirectory, _, _) = GetResultsFullGroupDirectories(outputResolution);
(string aResultsFullGroupDirectory, string bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); (string aResultsFullGroupDirectory, string bResultsFullGroupDirectory) = GetResultsFullGroupDirectories();
_Logger.Information(_Configuration.ModelDirectory); _Logger.Information(_Configuration.ModelDirectory);
@ -248,7 +249,7 @@ public class UnitTestFace
} }
if (property is null || item.Property is null) if (property is null || item.Property is null)
throw new NullReferenceException(nameof(property)); throw new NullReferenceException(nameof(property));
resizedFileHolder = resize.GetResizedFileHolder(item); resizedFileHolder = resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
(int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem); (int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);