FilePath ready to test

This commit is contained in:
2023-12-24 11:29:36 -07:00
parent af491371a3
commit 7007a9df2e
60 changed files with 960 additions and 857 deletions

View File

@ -39,24 +39,22 @@ internal abstract class DecadeLogic
string checkDirectory;
string? yearDirectory;
string yearDirectoryName;
string? personNameDirectory;
string personNameDirectoryName;
string? personKeyFormattedDirectory;
string? personKeyFormattedDirectoryName;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{
if (!File.Exists(locationContainer.File))
if (!File.Exists(locationContainer.FilePath.FullName))
continue;
dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value;
if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day)
File.SetCreationTime(locationContainer.File, dateTime);
File.SetCreationTime(locationContainer.FilePath.FullName, dateTime);
if (!moveToDecade)
continue;
personNameDirectory = Path.GetDirectoryName(locationContainer.File);
if (string.IsNullOrEmpty(personNameDirectory))
if (string.IsNullOrEmpty(locationContainer.FilePath.DirectoryName))
continue;
personNameDirectoryName = Path.GetFileName(personNameDirectory);
yearDirectory = Path.GetDirectoryName(personNameDirectory);
personNameDirectoryName = Path.GetFileName(locationContainer.FilePath.DirectoryName);
yearDirectory = Path.GetDirectoryName(locationContainer.FilePath.DirectoryName);
if (string.IsNullOrEmpty(yearDirectory))
continue;
yearDirectoryName = Path.GetFileName(yearDirectory);
@ -72,7 +70,7 @@ internal abstract class DecadeLogic
checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName);
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
File.Move(locationContainer.File, Path.Combine(checkDirectory, Path.GetFileName(locationContainer.File)));
File.Move(locationContainer.FilePath.FullName, Path.Combine(checkDirectory, locationContainer.FilePath.Name));
}
}

View File

@ -1,8 +1,10 @@
using Humanizer;
using ShellProgressBar;
using System.Buffers;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Map.Models.Stateless;
@ -11,7 +13,7 @@ internal record Record(string PersonKeyFormatted,
int DirectoryNumber,
string? PersonDisplayDirectoryName,
bool? IsDefault,
string MappedFaceFile);
FilePath MappedFaceFilePath);
internal abstract class DistanceLogic
{
@ -208,31 +210,36 @@ internal abstract class DistanceLogic
}
}
private static List<Record> GetRecords(Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName)
private static List<Record> GetRecords(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName)
{
List<Record> results = [];
int? id;
string fileName;
string checkFile;
FilePath filePath;
FileHolder fileHolder;
int? wholePercentages;
foreach (string mappedFaceFile in files)
foreach (string file in files)
{
if (mappedFaceFile.EndsWith(".lnk"))
if (file.EndsWith(".lnk"))
continue;
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile);
if (id is null || wholePercentages is null)
fileHolder = IFileHolder.Get(file);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (filePath.Id is null)
continue;
fileName = Path.GetFileName(mappedFaceFile);
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
if (wholePercentages is null)
continue;
fileName = Path.GetFileName(file);
if (distinct.Contains(fileName))
{
checkFile = $"{mappedFaceFile}.dup";
checkFile = $"{file}.dup";
if (File.Exists(checkFile))
continue;
File.Move(mappedFaceFile, checkFile);
File.Move(file, checkFile);
continue;
}
distinct.Add(fileName);
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile));
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, filePath));
}
return results;
}
@ -256,7 +263,7 @@ internal abstract class DistanceLogic
Directory.Move(personKeyDirectory, newestPersonKeyDirectory);
}
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
{
List<Record> results = [];
bool check;
@ -271,9 +278,9 @@ internal abstract class DistanceLogic
ProgressBar progressBar;
string[] yearDirectories;
string personKeyFormatted;
List<string> distinct = [];
string? personFirstInitial;
bool isReservedDirectoryName;
List<string> distinct = [];
string[] personNameDirectories;
string? newestPersonKeyFormatted;
string? personDisplayDirectoryName;
@ -331,7 +338,7 @@ internal abstract class DistanceLogic
isDefault = null;
personDisplayDirectoryName = null;
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories);
foreach (string file in files)
File.Delete(file);
@ -403,7 +410,7 @@ internal abstract class DistanceLogic
else
{
personFirstInitial = personDisplayDirectoryName[..1];
if (personFirstInitial.All(l => char.IsDigit(l)))
if (personFirstInitial.All(char.IsDigit))
{
foreach (string file in files)
File.Delete(file);
@ -419,7 +426,7 @@ internal abstract class DistanceLogic
Directory.Move(personNameDirectory, personFirstInitialDirectory);
files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
}
results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string personNameLinkDirectory in personNameLinkDirectories)
{

View File

@ -1,3 +1,4 @@
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Map.Models.Stateless;
@ -7,21 +8,20 @@ internal abstract class LookForAbandonedLogic
internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, List<int> distinctFilteredIds, string directory, string directoryName)
{
string fileNameWithoutExtension;
bool nameWithoutExtensionIsIdFormat;
FilePath filePath;
FileHolder fileHolder;
string fileNameFirstSegment;
List<string> renameCollection = [];
bool nameWithoutExtensionIsPaddedIdFormat;
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(propertyConfiguration.Offset);
string[] distinctFilteredIdsValues = distinctFilteredIds.Select(l => l.ToString()).ToArray();
string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
foreach (string file in files)
{
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(file)));
nameWithoutExtensionIsIdFormat = IProperty.NameWithoutExtensionIsIdFormat(fileNameWithoutExtension);
nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileNameWithoutExtension, sortOrderOnlyLengthIndex);
if (!nameWithoutExtensionIsIdFormat && !nameWithoutExtensionIsPaddedIdFormat)
fileHolder = IFileHolder.Get(file);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
fileNameFirstSegment = fileHolder.NameWithoutExtension.Split('.')[0];
if (!filePath.IsIntelligentIdFormat && filePath.SortOrder is null)
continue;
if (distinctFilteredIdsValues.Contains(fileNameWithoutExtension))
if (distinctFilteredIdsValues.Contains(fileNameFirstSegment))
continue;
renameCollection.Add(file);
}

View File

@ -17,66 +17,67 @@ internal abstract class MapLogic
string PersonKeyFormatted,
string? PersonDisplayDirectoryName,
int? DirectoryNumber,
string File);
FilePath FilePath);
internal record Duplicate(long PersonKey,
int Id,
string File,
FilePath FilePath,
float? Percent);
internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
string? PersonDisplayDirectoryName,
bool? IsDefault,
string MappedFaceFile,
FilePath MappedFaceFilePath,
int Id,
int WholePercentages);
internal static void SetSkipCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<int, List<(string, int)>> skipCollection, Dictionary<int, List<(string, int)>> skipNotSkipCollection)
{
int? id;
string fileName;
string checkFile;
int? wholePercentages;
List<FilePath> distinct = [];
List<string> distinctFiles = [];
List<string> distinctFileName = [];
bool skipNotSkipDirectoriesAny = configuration.SkipNotSkipDirectories.Length > 0;
string[] checkDirectories = (from l in configuration.SkipNotSkipDirectories select Path.GetFullPath($"{a2PeopleSingletonDirectory}{l}")).ToArray();
foreach (PersonContainer personContainer in personContainers)
{
foreach (string personDisplayDirectoryAllFile in personContainer.DisplayDirectoryAllFiles)
foreach (FilePath personDisplayDirectoryAllFilePath in personContainer.DisplayDirectoryAllFilePaths)
{
if (!personDisplayDirectoryAllFile.EndsWith(configuration.FacesFileNameExtension))
if (personDisplayDirectoryAllFilePath.ExtensionLowered != configuration.FacesFileNameExtension)
continue;
if (distinctFiles.Contains(personDisplayDirectoryAllFile))
if (distinctFiles.Contains(personDisplayDirectoryAllFilePath.FullName))
continue;
distinctFiles.Add(personDisplayDirectoryAllFile);
distinctFiles.Add(personDisplayDirectoryAllFilePath.FullName);
distinct.Add(personDisplayDirectoryAllFilePath);
}
}
foreach (string distinctFile in distinctFiles)
foreach (FilePath filePath in distinct)
{
fileName = Path.GetFileName(distinctFile);
if (distinctFileName.Contains(fileName))
if (distinctFileName.Contains(filePath.Name))
{
checkFile = $"{distinctFile}.dup";
checkFile = $"{filePath.FullName}.dup";
if (File.Exists(checkFile))
continue;
File.Move(distinctFile, checkFile);
File.Move(filePath.FullName, checkFile);
continue;
}
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, distinctFile);
if (id is null || wholePercentages is null)
if (filePath.Id is null)
continue;
if (!skipNotSkipDirectoriesAny || !checkDirectories.Any(l => distinctFile.StartsWith(l)))
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
if (wholePercentages is null)
continue;
if (!skipNotSkipDirectoriesAny || !checkDirectories.Any(l => filePath.FullName.StartsWith(l)))
{
if (!skipCollection.ContainsKey(id.Value))
skipCollection.Add(id.Value, []);
skipCollection[id.Value].Add((distinctFile, wholePercentages.Value));
if (!skipCollection.ContainsKey(filePath.Id.Value))
skipCollection.Add(filePath.Id.Value, []);
skipCollection[filePath.Id.Value].Add((filePath.FullName, wholePercentages.Value));
}
else
{
if (!skipNotSkipCollection.ContainsKey(id.Value))
skipNotSkipCollection.Add(id.Value, []);
skipNotSkipCollection[id.Value].Add((distinctFile, wholePercentages.Value));
if (!skipNotSkipCollection.ContainsKey(filePath.Id.Value))
skipNotSkipCollection.Add(filePath.Id.Value, []);
skipNotSkipCollection[filePath.Id.Value].Add((filePath.FullName, wholePercentages.Value));
}
}
}
@ -96,8 +97,7 @@ internal abstract class MapLogic
if (personContainer.Birthdays.Length < 1)
continue;
newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value);
if (!personKeyFormattedToNewestPersonKeyFormatted.ContainsKey(personKeyFormatted))
personKeyFormattedToNewestPersonKeyFormatted.Add(personKeyFormatted, newestPersonKeyFormatted);
_ = personKeyFormattedToNewestPersonKeyFormatted.TryAdd(personKeyFormatted, newestPersonKeyFormatted);
}
}
}
@ -184,23 +184,21 @@ internal abstract class MapLogic
private static List<MappedFile> GetDisplayDirectoryAllFiles(string fileNameExtension, string personBirthdayFormat, ReadOnlyCollection<PersonContainer> personContainers)
{
List<MappedFile> results = [];
string fileName;
string personKeyFormatted;
List<string> distinct = [];
foreach (PersonContainer personContainer in personContainers)
{
if (personContainer.Key is null)
continue;
for (int i = personContainer.DisplayDirectoryAllFiles.Length - 1; i > -1; i--)
for (int i = personContainer.DisplayDirectoryAllFilePaths.Count - 1; i > -1; i--)
{
if (!personContainer.DisplayDirectoryAllFiles[i].EndsWith(fileNameExtension))
if (personContainer.DisplayDirectoryAllFilePaths[i].ExtensionLowered != fileNameExtension)
continue;
fileName = Path.GetFileName(personContainer.DisplayDirectoryAllFiles[i]);
if (distinct.Contains(fileName))
if (distinct.Contains(personContainer.DisplayDirectoryAllFilePaths[i].Name))
continue;
distinct.Add(fileName);
distinct.Add(personContainer.DisplayDirectoryAllFilePaths[i].Name);
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value);
results.Add(new(personContainer.Key.Value, personKeyFormatted, personContainer.DisplayDirectoryName, null, personContainer.DisplayDirectoryAllFiles[i]));
results.Add(new(personContainer.Key.Value, personKeyFormatted, personContainer.DisplayDirectoryName, null, personContainer.DisplayDirectoryAllFilePaths[i]));
}
}
return results;
@ -213,30 +211,30 @@ internal abstract class MapLogic
{
if (duplicate.Percent is null)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(duplicate.File), "\""));
_ = Process.Start("explorer.exe", string.Concat("\"", duplicate.FilePath.DirectoryName, "\""));
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, duplicate.PersonKey);
}
foreach ((long personKey, int id, string file, float? percent) in duplicates)
foreach ((long personKey, int id, FilePath filePath, float? percent) in duplicates)
{
if (percent is not null && percent.Value == 0)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
_ = Process.Start("explorer.exe", string.Concat("\"", filePath.DirectoryName, "\""));
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey);
}
foreach ((long personKey, int id, string file, float? percent) in duplicates)
foreach ((long personKey, int id, FilePath filePath, float? percent) in duplicates)
{
if (percent is not null && percent.Value > 0)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
_ = Process.Start("explorer.exe", string.Concat("\"", filePath.DirectoryName, "\""));
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey);
}
}
internal static string GetFacesDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dFacesContentDirectory, MappingFromItem mappingFromItem)
internal static string GetFacesDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dFacesContentDirectory, FilePath filePath, MappingFromItem mappingFromItem)
{
string result;
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.NameWithoutExtension);
result = Path.Combine(dFacesContentDirectory, propertyConfiguration.ResultAllInOne, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension);
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
result = Path.Combine(dFacesContentDirectory, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension);
return result;
}
@ -286,8 +284,7 @@ internal abstract class MapLogic
personKeyToPersonContainerCollection.Add(personContainer.Key.Value, []);
personKeyToPersonContainerCollection[personContainer.Key.Value].Add(personContainer);
newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value);
if (!personKeyFormattedToPersonContainer.ContainsKey(newestPersonKeyFormatted))
personKeyFormattedToPersonContainer.Add(newestPersonKeyFormatted, personContainer);
_ = personKeyFormattedToPersonContainer.TryAdd(newestPersonKeyFormatted, personContainer);
}
foreach (KeyValuePair<long, List<PersonContainer>> keyValuePair in personKeyToPersonContainerCollection)
{
@ -379,7 +376,7 @@ internal abstract class MapLogic
int? approximateYears = null;
PersonBirthday personBirthday;
PersonContainer personContainer;
string[] personDisplayDirectoryAllFiles = [];
List<FilePath> personDisplayDirectoryAllFilePaths = [];
DateTime incrementDate = new(configuration.PersonBirthdayFirstYear, 1, 1);
long oneHour = new DateTime(1, 1, 1, 1, 0, 0).Ticks - new DateTime(1, 1, 1).Ticks;
for (int i = 0; i < int.MaxValue; i++)
@ -409,7 +406,7 @@ internal abstract class MapLogic
if (check)
continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personKey + (oneHour * 2));
personContainer = new(approximateYears, [personBirthday], personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey);
personContainer = new(approximateYears, [personBirthday], new(personDisplayDirectoryAllFilePaths), configuration.MappingDefaultName, personKey);
results.Add(personContainer);
if (results.Count > 99)
break;
@ -429,13 +426,13 @@ internal abstract class MapLogic
return result;
}
private static List<MappedFile> GetMappedFiles(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
private static List<MappedFile> GetMappedFiles(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
{
List<MappedFile> results = [];
string file;
long personKey;
string fileName;
string checkFile;
FilePath filePath;
FileHolder fileHolder;
List<string> distinct = [];
PersonBirthday? personBirthday;
results.AddRange(GetDisplayDirectoryAllFiles(configuration.FacesFileNameExtension, configuration.PersonBirthdayFormat, personContainers));
@ -444,50 +441,66 @@ internal abstract class MapLogic
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, record.PersonKeyFormatted);
if (personBirthday is null)
continue;
fileName = Path.GetFileName(record.MappedFaceFile);
if (distinct.Contains(fileName))
if (distinct.Contains(record.MappedFaceFilePath.Name))
continue;
distinct.Add(fileName);
distinct.Add(record.MappedFaceFilePath.Name);
personKey = personBirthday.Value.Ticks;
results.Add(new(personKey, record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.DirectoryNumber, record.MappedFaceFile));
results.Add(new(personKey, record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.DirectoryNumber, record.MappedFaceFilePath));
}
for (int i = results.Count - 1; i > -1; i--)
{
file = results[i].File;
if (file.EndsWith(".old"))
filePath = results[i].FilePath;
if (filePath.Name.EndsWith(".old"))
{
results.RemoveAt(i);
continue;
}
if (!file.EndsWith(".dup") && !file.EndsWith(".unk") && !file.EndsWith(".abd"))
if (!filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk") && !filePath.Name.EndsWith(".abd"))
continue;
if (!File.Exists(file))
if (!File.Exists(filePath.Name))
continue;
checkFile = file[..^4];
checkFile = filePath.FullName[..^4];
if (File.Exists(checkFile))
continue;
File.Move(file, checkFile);
results[i] = new(results[i].PersonKey, results[i].PersonKeyFormatted, results[i].PersonDisplayDirectoryName, results[i].DirectoryNumber, file[..^4]);
File.Move(filePath.FullName, checkFile);
fileHolder = IFileHolder.Get(checkFile);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
results[i] = new(results[i].PersonKey, results[i].PersonKeyFormatted, results[i].PersonDisplayDirectoryName, results[i].DirectoryNumber, filePath);
}
return results;
}
private static void ParallelFor(Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappedFile mappedFile)
private static void ParallelFor(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappedFile mappedFile)
{
int? id;
string checkFile;
DateOnly dateOnly;
FilePath filePath;
string[] fileMatches;
FileHolder fileHolder;
int? wholePercentages;
const string lnk = ".lnk";
int? id, wholePercentages;
string personDisplayDirectoryName;
const bool fromDistanceContent = true;
IReadOnlyList<MetadataExtractor.Directory> directories;
List<(string File, int WholePercentages)>? wholePercentagesCollection;
if (!mappedFile.File.EndsWith(lnk))
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File);
if (!mappedFile.FilePath.Name.EndsWith(lnk))
{
if (mappedFile.FilePath.Id is null)
return;
id = mappedFile.FilePath.Id;
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, mappedFile.FilePath);
}
else
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File[..^4]);
if (id is null || wholePercentages is null)
{
fileHolder = IFileHolder.Get(mappedFile.FilePath.FullName[..^4]);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (filePath.Id is null)
return;
id = filePath.Id;
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
}
if (wholePercentages is null)
return;
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection))
{
@ -503,11 +516,11 @@ internal abstract class MapLogic
continue;
}
}
dateOnly = DateOnly.FromDateTime(new FileInfo(mappedFile.File).CreationTime);
if (mappedFile.File.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch) || !File.Exists(mappedFile.File))
dateOnly = DateOnly.FromDateTime(new DateTime(mappedFile.FilePath.CreationTicks));
if (mappedFile.FilePath.Name.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch) || !File.Exists(mappedFile.FilePath.FullName))
directories = new List<MetadataExtractor.Directory>();
else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.File);
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.FilePath.FullName);
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName;
lock (locationContainers)
@ -515,7 +528,7 @@ internal abstract class MapLogic
directories,
mappedFile.DirectoryNumber,
personDisplayDirectoryName,
mappedFile.File,
mappedFile.FilePath,
fromDistanceContent,
id.Value,
null,
@ -529,11 +542,11 @@ internal abstract class MapLogic
string key;
float? percent;
float itemPercentagesArea;
List<string> delete = [];
List<FilePath> delete = [];
List<Duplicate> duplicates = [];
RectangleF? itemPercentagesRectangle;
(string File, int WholePercentages) item;
Dictionary<string, (string, int)> distinct = [];
(FilePath FilePath, int WholePercentages) item;
Dictionary<string, (FilePath, int)> distinct = [];
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{
key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
@ -549,12 +562,12 @@ internal abstract class MapLogic
itemPercentagesArea = itemPercentagesRectangle.Value.Width * itemPercentagesRectangle.Value.Height;
percent = ILocation.GetIntersectPercent(itemPercentagesRectangle.Value, itemPercentagesArea, locationContainer.Rectangle.Value);
}
delete.Add(item.File);
delete.Add(locationContainer.File);
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent));
delete.Add(item.FilePath);
delete.Add(locationContainer.FilePath);
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.FilePath, percent));
continue;
}
distinct.Add(key, new(locationContainer.File, locationContainer.WholePercentages));
distinct.Add(key, new(locationContainer.FilePath, locationContainer.WholePercentages));
}
if (!configuration.DeletePossibleDuplicates && duplicates.Count > 0)
OpenPossibleDuplicates(configuration, duplicates);
@ -562,10 +575,10 @@ internal abstract class MapLogic
{
if (delete.Count > 8)
throw new Exception("Something maybe wrong!");
foreach (string file in delete)
foreach (FilePath filePath in delete)
{
if (File.Exists(file))
File.Delete(file);
if (File.Exists(filePath.FullName))
File.Delete(filePath.FullName);
}
}
}
@ -584,10 +597,10 @@ internal abstract class MapLogic
else
{
string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromItem.ImageFileHolder.Name}{facePartsFileNameExtension}");
result = new(checkFile, directory, new(facePartsContentCollectionFile));
result = new(checkFile, directory, IFileHolder.Get(facePartsContentCollectionFile));
}
string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, keyMapping.MappingFromItem);
FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"));
string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, keyMapping.FilePath, keyMapping.MappingFromItem);
FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"));
if (!faceFileHolder.Exists)
saveContainer = null;
else
@ -714,8 +727,7 @@ internal abstract class MapLogic
}
if (personContainer.Key is null)
throw new Exception();
if (!personKeyToCount.ContainsKey(personContainer.Key.Value))
personKeyToCount.Add(personContainer.Key.Value, 0);
_ = personKeyToCount.TryAdd(personContainer.Key.Value, 0);
personKeyToCount[personContainer.Key.Value]++;
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(new(personKeyFormattedIdThenWholePercentages, personContainer));
}
@ -731,29 +743,30 @@ internal abstract class MapLogic
return results;
}
internal static ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> GetPersonKeyFormattedIdThenWholePercentages(Configuration configuration, long ticks, List<Record> collection)
internal static ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> GetPersonKeyFormattedIdThenWholePercentages(Configuration configuration, long ticks, List<Record> records)
{
List<PersonKeyFormattedIdThenWholePercentages> results = [];
int? id;
int? wholePercentages;
List<int> wholePercentagesCollection;
Dictionary<int, List<int>> idToWholePercentagesCollection = [];
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") {collection.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)";
string message = $") {records.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(collection.Count, message, options);
foreach (Record record in collection)
using ProgressBar progressBar = new(records.Count, message, options);
foreach (Record record in records)
{
progressBar.Tick();
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, record.MappedFaceFile);
if (id is null || wholePercentages is null)
if (record.MappedFaceFilePath.Id is null)
continue;
if (!idToWholePercentagesCollection.ContainsKey(id.Value))
idToWholePercentagesCollection.Add(id.Value, []);
wholePercentagesCollection = idToWholePercentagesCollection[id.Value];
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, record.MappedFaceFilePath);
if (wholePercentages is null)
continue;
if (!idToWholePercentagesCollection.ContainsKey(record.MappedFaceFilePath.Id.Value))
idToWholePercentagesCollection.Add(record.MappedFaceFilePath.Id.Value, []);
wholePercentagesCollection = idToWholePercentagesCollection[record.MappedFaceFilePath.Id.Value];
wholePercentagesCollection.Add(wholePercentages.Value);
idToWholePercentagesCollection[id.Value].Add(wholePercentages.Value);
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.MappedFaceFile, id.Value, wholePercentages.Value));
idToWholePercentagesCollection[record.MappedFaceFilePath.Id.Value].Add(wholePercentages.Value);
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.MappedFaceFilePath, record.MappedFaceFilePath.Id.Value, wholePercentages.Value));
}
return new(results);
}
@ -801,16 +814,17 @@ internal abstract class MapLogic
int? approximateYears = null;
PersonBirthday? personBirthday;
PersonContainer personContainer;
List<PersonContainer>? collection;
displayDirectoryName = configuration.MappingDefaultName;
foreach (KeyValuePair<long, int> keyValuePair in personKeyToCount)
{
if (personKeyToPersonContainer.ContainsKey(keyValuePair.Key))
continue;
personBirthday = IPersonBirthday.GetPersonBirthday(keyValuePair.Key);
if (!personKeyToPersonContainerCollection.ContainsKey(keyValuePair.Key))
if (!personKeyToPersonContainerCollection.TryGetValue(keyValuePair.Key, out collection))
personContainer = new(approximateYears, personBirthday, displayDirectoryName, keyValuePair.Key);
else
personContainer = new(approximateYears, personBirthday, personKeyToPersonContainerCollection[keyValuePair.Key][zero].PersonDirectory, displayDirectoryName, keyValuePair.Key);
personContainer = new(approximateYears, personBirthday, collection[zero].PersonDirectory, displayDirectoryName, keyValuePair.Key);
personKeyToPersonContainer.Add(keyValuePair.Key, personContainer);
}
}
@ -825,8 +839,8 @@ internal abstract class MapLogic
string checkFile;
const int zero = 0;
string personKeyFormatted;
string[] deleteCollection;
List<string> distinct = [];
FilePath[] deleteCollection;
PersonBirthday personBirthday;
string personDisplayDirectory;
DateTime dateTime = new(ticks);
@ -837,49 +851,49 @@ internal abstract class MapLogic
continue;
if (a2PeopleSingletonDirectory is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
continue;
fileName = $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFile)}{configuration.FacesHiddenFileNameExtension}";
fileName = $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName)}{configuration.FacesHiddenFileNameExtension}";
personBirthday = personContainer.Birthdays[zero];
personKey = personBirthday.Value.Ticks;
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
personDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personContainer.DisplayDirectoryName);
personKeyFormattedDirectory = Path.GetFullPath(Path.Combine(personDisplayDirectory, personKeyFormatted));
deleteCollection = (from l in personContainer.DisplayDirectoryAllFiles where l.StartsWith(personKeyFormattedDirectory) select l).ToArray();
if (personContainer.DisplayDirectoryAllFiles.Length != 0 && deleteCollection.Length == 0)
deleteCollection = (from l in personContainer.DisplayDirectoryAllFilePaths where l.FullName.StartsWith(personKeyFormattedDirectory) select l).ToArray();
if (personContainer.DisplayDirectoryAllFilePaths.Count != 0 && deleteCollection.Length == 0)
throw new NotSupportedException();
if (!Directory.Exists(personKeyFormattedDirectory))
_ = Directory.CreateDirectory(personKeyFormattedDirectory);
_ = readOnlyPersonKeyToCount.TryGetValue(personKey, out count);
_ = Directory.CreateDirectory(Path.Combine(personDisplayDirectory, count.ToString("0000")));
Directory.SetLastWriteTime(personDisplayDirectory, dateTime.AddMinutes(count));
matches = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(fileName) select true).ToArray();
matches = (from l in personContainer.DisplayDirectoryAllFilePaths where l.FullName.EndsWith(fileName) select true).ToArray();
if (matches.Length > 0)
continue;
matches = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(configuration.FacesHiddenFileNameExtension) select true).ToArray();
matches = (from l in personContainer.DisplayDirectoryAllFilePaths where l.FullName.EndsWith(configuration.FacesHiddenFileNameExtension) select true).ToArray();
if (matches.Length > 0)
continue;
if (!File.Exists(personKeyFormattedIdThenWholePercentages.MappedFaceFile))
if (!File.Exists(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName))
continue;
checkFile = Path.Combine(personKeyFormattedDirectory, $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFile)}{configuration.FacesHiddenFileNameExtension}");
checkFile = Path.Combine(personKeyFormattedDirectory, $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName)}{configuration.FacesHiddenFileNameExtension}");
if (File.Exists(checkFile))
continue;
File.Copy(personKeyFormattedIdThenWholePercentages.MappedFaceFile, checkFile);
foreach (string delete in deleteCollection)
File.Copy(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName, checkFile);
foreach (FilePath delete in deleteCollection)
{
if (delete.EndsWith(".lnk"))
if (delete.ExtensionLowered == ".lnk")
continue;
if (!File.Exists(delete))
if (!File.Exists(delete.FullName))
continue;
File.Delete(delete);
File.Delete(delete.FullName);
}
Directory.SetLastWriteTime(personDisplayDirectory, DateTime.Now);
distinct.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
}
}
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
{
List<LocationContainer<MetadataExtractor.Directory>> results = [];
List<MappedFile> mappedFiles = GetMappedFiles(configuration, personContainers, records);
List<MappedFile> mappedFiles = GetMappedFiles(propertyConfiguration, configuration, personContainers, records);
if (mappedFiles.Count > 0 && (configuration.DistanceMoveUnableToMatch || configuration.DistanceRenameToMatch))
{
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
@ -890,7 +904,7 @@ internal abstract class MapLogic
_ = Parallel.For(0, mappedFiles.Count, parallelOptions, (i, state) =>
{
progressBar.Tick();
ParallelFor(configuration, skipCollection, results, mappedFiles[i]);
ParallelFor(propertyConfiguration, configuration, skipCollection, results, mappedFiles[i]);
});
}
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
@ -904,33 +918,27 @@ internal abstract class MapLogic
internal static int CopyManualFiles(Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string eDistanceContentTicksDirectory)
{
int result = 0;
string fileName;
string checkFile;
string? directory;
string dateDirectory;
string directoryName;
string checkDirectory;
string personKeyFormatted;
PersonBirthday personBirthday;
List<string> distinct = [];
PersonBirthday personBirthday;
DateTime dateTime = new(ticks);
string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy);
foreach (PersonContainer personContainer in personContainers)
{
if (personContainer.Key is null)
continue;
for (int i = personContainer.DisplayDirectoryAllFiles.Length - 1; i > -1; i--)
for (int i = personContainer.DisplayDirectoryAllFilePaths.Count - 1; i > -1; i--)
{
if (!personContainer.DisplayDirectoryAllFiles[i].EndsWith(configuration.FacesFileNameExtension))
if (personContainer.DisplayDirectoryAllFilePaths[i].ExtensionLowered != configuration.FacesFileNameExtension)
continue;
fileName = Path.GetFileName(personContainer.DisplayDirectoryAllFiles[i]);
if (distinct.Contains(fileName))
if (distinct.Contains(personContainer.DisplayDirectoryAllFilePaths[i].Name))
continue;
distinct.Add(fileName);
directory = Path.GetDirectoryName(personContainer.DisplayDirectoryAllFiles[i]);
if (string.IsNullOrEmpty(directory))
continue;
directoryName = Path.GetFileName(directory);
distinct.Add(personContainer.DisplayDirectoryAllFilePaths[i].Name);
directoryName = Path.GetFileName(personContainer.DisplayDirectoryAllFilePaths[i].DirectoryName);
if (directoryName != personContainer.DisplayDirectoryName)
continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personContainer.Key.Value);
@ -939,12 +947,13 @@ internal abstract class MapLogic
checkDirectory = Path.Combine(dateDirectory, personContainer.DisplayDirectoryName);
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
checkFile = Path.Combine(dateDirectory, fileName);
checkFile = Path.Combine(dateDirectory, personContainer.DisplayDirectoryAllFilePaths[i].Name);
if (File.Exists(checkFile))
continue;
File.Move(personContainer.DisplayDirectoryAllFiles[i], checkFile);
personContainer.DisplayDirectoryAllFiles[i] = string.Empty;
result++;
File.Move(personContainer.DisplayDirectoryAllFilePaths[i].FullName, checkFile);
throw new NotImplementedException("readonly null?");
// personContainer.DisplayDirectoryAllFilePaths[i] = null;
// result++;
}
}
return result;
@ -961,11 +970,11 @@ internal abstract class MapLogic
return result;
}
internal static string GetFacePartsDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string d2FacePartsContentDirectory, MappingFromItem mappingFromItem)
internal static string GetFacePartsDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string d2FacePartsContentDirectory, FilePath filePath, MappingFromItem mappingFromItem)
{
string result;
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.NameWithoutExtension);
result = Path.Combine(d2FacePartsContentDirectory, propertyConfiguration.ResultAllInOne, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension);
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
result = Path.Combine(d2FacePartsContentDirectory, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension);
return result;
}
@ -975,7 +984,7 @@ internal abstract class MapLogic
string shortcutFile;
if (sortingContainer?.Source.MappingFromLocation is null)
throw new NullReferenceException(nameof(sortingContainer.Source.MappingFromLocation));
FileHolder faceFileHolder = new($"C:/{sortingContainer.Sorting.Id}.{sortingContainer.Sorting.WholePercentages}");
FileHolder faceFileHolder = IFileHolder.Get($"C:/{sortingContainer.Sorting.Id}.{sortingContainer.Sorting.WholePercentages}");
if (keyMapping.MappingFromPerson is not null && keyMapping.MappingFromLocation is not null)
shortcutFile = Path.Combine(directory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk");
else

View File

@ -19,7 +19,7 @@ internal abstract class RelationLogic
{
if (!locationContainer.FromDistanceContent)
continue;
if (!locationContainer.File.Contains(configuration.LocationContainerDirectoryPattern))
if (!locationContainer.FilePath.FullName.Contains(configuration.LocationContainerDirectoryPattern))
continue;
if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo))
{
@ -312,9 +312,9 @@ internal abstract class RelationLogic
{
lines.Clear();
if (movedFiles.TryGetValue(relationFileHolder.FullName, out file))
fileHolder = new(file);
fileHolder = IFileHolder.Get(file);
else
fileHolder = new(relationFileHolder.FullName);
fileHolder = IFileHolder.Get(relationFileHolder.FullName);
if (!relationFileHolder.Exists || relationFileHolder.CreationTime is null)
continue;
if (isCounterPersonYear)
@ -344,9 +344,9 @@ internal abstract class RelationLogic
{
relation = relations[i];
if (movedFiles.TryGetValue(relation.File, out file))
fileHolder = new(file);
fileHolder = IFileHolder.Get(file);
else
fileHolder = new(relation.File);
fileHolder = IFileHolder.Get(relation.File);
if (!fileHolder.Exists || fileHolder.CreationTime is null)
continue;
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileHolder.NameWithoutExtension);