From 331d98793ee41f59499c1ddd2b6751b026121e17 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Fri, 8 Sep 2023 23:22:55 -0700 Subject: [PATCH] LocationContainerDebugDirectory --- Distance/Models/_E_Distance.cs | 62 ++++++-- Instance/DlibDotNet.cs | 3 + Instance/Models/Binder/Configuration.cs | 3 + Instance/Models/Configuration.cs | 1 + Map/Models/Configuration.cs | 1 + Map/Models/MapLogic.cs | 74 ++++++---- Map/Models/Stateless/MapLogic.cs | 157 +++++++++++++++------ Shared/Models/Methods/IDistance.cs | 2 +- Shared/Models/Stateless/Methods/IPerson.cs | 4 +- Tests/UnitTestHardCoded.cs | 51 +++++-- 10 files changed, 264 insertions(+), 94 deletions(-) diff --git a/Distance/Models/_E_Distance.cs b/Distance/Models/_E_Distance.cs index 6d76b83..a6d9d54 100644 --- a/Distance/Models/_E_Distance.cs +++ b/Distance/Models/_E_Distance.cs @@ -503,12 +503,14 @@ public partial class E_Distance : IDistance _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); } - private static void MoveFiles(Dictionary keyValuePairs, List linkedOnce, List linkedTwice, List linkedThrice) + private static void MoveFiles(string locationContainerDebugDirectory, bool isCounterPersonYear, string? displayDirectoryName, Dictionary keyValuePairs, List linkedOnce, List linkedTwice, List linkedThrice, List linkedFour, List linkedFive) { string checkFile; + string debugFile; string checkDirectory; string? yearDirectory; string? personNameDirectory; + string? maybeTicksDirectoryName; string? personNameDirectoryName; string? personKeyFormattedDirectory; foreach (string file in linkedOnce) @@ -517,28 +519,60 @@ public partial class E_Distance : IDistance keyValuePairs[file] += 1; foreach (string file in linkedThrice) keyValuePairs[file] += 1; + foreach (string file in linkedFour) + keyValuePairs[file] += 1; + foreach (string file in linkedFive) + keyValuePairs[file] += 1; foreach (KeyValuePair keyValuePair in keyValuePairs) { personNameDirectory = Path.GetDirectoryName(keyValuePair.Key); yearDirectory = Path.GetDirectoryName(personNameDirectory); personNameDirectoryName = Path.GetFileName(personNameDirectory); personKeyFormattedDirectory = Path.GetDirectoryName(yearDirectory); + maybeTicksDirectoryName = Path.GetFileName(personKeyFormattedDirectory); if (string.IsNullOrEmpty(personNameDirectory) || string.IsNullOrEmpty(yearDirectory) || string.IsNullOrEmpty(personKeyFormattedDirectory) || string.IsNullOrEmpty(personNameDirectoryName)) continue; - checkDirectory = Path.Combine(personKeyFormattedDirectory, $"{keyValuePair.Value}{new string(Convert.ToChar(65 + keyValuePair.Value), 7)}"); - if (checkDirectory == yearDirectory) + if (maybeTicksDirectoryName == locationContainerDebugDirectory) + checkDirectory = Path.Combine(yearDirectory, $"{keyValuePair.Value}{new string(Convert.ToChar(65 + keyValuePair.Value), 7)}"); + else + { + if (!string.IsNullOrEmpty(locationContainerDebugDirectory)) + continue; + checkDirectory = Path.Combine(personKeyFormattedDirectory, $"{keyValuePair.Value}{new string(Convert.ToChar(65 + keyValuePair.Value), 7)}"); + } + if (maybeTicksDirectoryName != locationContainerDebugDirectory) + { + if (isCounterPersonYear || string.IsNullOrEmpty(displayDirectoryName)) + checkDirectory = Path.Combine(checkDirectory, personNameDirectoryName); + else + checkDirectory = Path.Combine(checkDirectory, displayDirectoryName[0].ToString()); + } + if (checkDirectory == personNameDirectory) continue; - checkDirectory = Path.Combine(checkDirectory, personNameDirectoryName); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); checkFile = Path.Combine(checkDirectory, Path.GetFileName(keyValuePair.Key)); if (File.Exists(checkFile)) continue; File.Move(keyValuePair.Key, checkFile); + debugFile = $"{keyValuePair.Key[..^4]}.gif"; + if (File.Exists(debugFile)) + { + checkFile = Path.Combine(checkDirectory, $"{Path.GetFileName(keyValuePair.Key)[..^4]}.gif"); + if (File.Exists(checkFile)) + continue; + File.Move(debugFile, checkFile); + } + if (maybeTicksDirectoryName == locationContainerDebugDirectory && !string.IsNullOrEmpty(displayDirectoryName)) + { + checkDirectory = Path.Combine(checkDirectory, displayDirectoryName); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + } } } - private static void SaveMappedForOutputResolutions(string eDistanceContentDirectory, float distanceTolerance, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, List records, string directory) + private static void SaveMappedForOutputResolutions(string locationContainerDebugDirectory, string eDistanceContentDirectory, float distanceTolerance, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, List records, string directory) { int years; string text; @@ -547,6 +581,8 @@ public partial class E_Distance : IDistance List files = new(); List lines = new(); List results = new(); + List linkedFive = new(); + List linkedFour = new(); List linkedOnce = new(); long ticks = DateTime.Now.Ticks; string fileNameWithoutExtension; @@ -606,6 +642,16 @@ public partial class E_Distance : IDistance linkedThrice.Add(mapped.File); continue; } + if (!linkedFour.Contains(mapped.File)) + { + linkedFour.Add(mapped.File); + continue; + } + if (!linkedFive.Contains(mapped.File)) + { + linkedFive.Add(mapped.File); + continue; + } } if (isCounterPersonYear) (years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(ticks, fileInfo.CreationTime.Ticks); @@ -633,10 +679,10 @@ public partial class E_Distance : IDistance if (!Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(directory, $"{fileNameWithoutExtension}.md"), text, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null)) continue; } - MoveFiles(keyValuePairs, linkedOnce, linkedTwice, linkedThrice); + MoveFiles(locationContainerDebugDirectory, isCounterPersonYear, displayDirectoryName, keyValuePairs, linkedOnce, linkedTwice, linkedThrice, linkedFour, linkedFive); } - void IDistance.SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName) + void IDistance.SaveMappedForOutputResolutions(string locationContainerDebugDirectory, string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName) { string? json; List records = new(); @@ -659,7 +705,7 @@ public partial class E_Distance : IDistance if (records.Count > 0) { WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory); - SaveMappedForOutputResolutions(eDistanceContentDirectory, locationContainerDistanceTolerance, personKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, records, directory); + SaveMappedForOutputResolutions(locationContainerDebugDirectory, eDistanceContentDirectory, locationContainerDistanceTolerance, personKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, records, directory); } _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(directory); } diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index e7266b7..0d0fe2e 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -170,6 +170,8 @@ public partial class DlibDotNet throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermyriadTolerance)); if (configuration.RangeFaceConfidence.Length != 3) throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + if (configuration.LocationContainerDistanceTolerance is null && !string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) + throw new NullReferenceException($"{nameof(configuration.LocationContainerDistanceTolerance)} must have a value when {nameof(configuration.LocationContainerDebugDirectory)} is set!"); _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]); if (configuration.OutputResolutions.Length == 0 || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be fileNameToCollection valid outputResolution!"); @@ -840,6 +842,7 @@ public partial class DlibDotNet configuration.DistanceRenameToMatch, configuration.FaceConfidencePercent, configuration.FaceDistancePermyriad, + configuration.LocationContainerDebugDirectory, configuration.LocationContainerDistanceTolerance, configuration.LocationDigits, configuration.MappingDefaultName, diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index 077016c..db2faf5 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -32,6 +32,7 @@ public class Configuration public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } public bool? LoadPhotoPrismLocations { get; set; } + public string? LocationContainerDebugDirectory { get; set; } public float? LocationContainerDistanceTolerance { get; set; } public int? LocationDigits { get; set; } public int? LocationFactor { get; set; } @@ -130,6 +131,7 @@ public class Configuration // if (configuration?.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions)); // if (configuration?.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)); if (configuration?.LoadPhotoPrismLocations is null) throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); + if (configuration?.LocationContainerDebugDirectory is null) throw new NullReferenceException(nameof(configuration.LocationContainerDebugDirectory)); // if (configuration?.LocationContainerDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTolerance)); if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); if (configuration?.LocationFactor is null) throw new NullReferenceException(nameof(configuration.LocationFactor)); @@ -215,6 +217,7 @@ public class Configuration configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ?? Array.Empty(), configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ?? Array.Empty(), configuration.LoadPhotoPrismLocations.Value, + configuration.LocationContainerDebugDirectory, configuration.LocationContainerDistanceTolerance, configuration.LocationDigits.Value, configuration.LocationFactor.Value, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index f71d159..7f64f77 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -26,6 +26,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration, string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, bool LoadPhotoPrismLocations, + string LocationContainerDebugDirectory, float? LocationContainerDistanceTolerance, int LocationDigits, int LocationFactor, diff --git a/Map/Models/Configuration.cs b/Map/Models/Configuration.cs index 7374b68..c3c4667 100644 --- a/Map/Models/Configuration.cs +++ b/Map/Models/Configuration.cs @@ -5,6 +5,7 @@ public record Configuration(bool DeletePossibleDuplicates, bool DistanceRenameToMatch, int FaceConfidencePercent, int FaceDistancePermyriad, + string LocationContainerDebugDirectory, float? LocationContainerDistanceTolerance, int LocationDigits, string MappingDefaultName, diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index e8e09ea..3b77de5 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -18,6 +18,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic [GeneratedRegex("[\\\\,\\/,\\:,\\*,\\?,\\\",\\<,\\>,\\|]")] private static partial Regex FileSystemSafe(); + internal record Record(string? DebugDirectory, + string? Directory, + long? Ticks, + string PersonDirectory); + public void SaveContainers(int? updated, List saveContainers) { if (_Configuration is null) @@ -116,7 +121,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic continue; try { - string description = saveContainer.FaceFileHolder is not null ? saveContainer.FaceFileHolder.Name : string.Empty; + string description; + if (saveContainer.FaceFileHolder is not null && saveContainer.FaceFileHolder.Name.StartsWith(saveContainer.ResizedFileHolder.Name)) + description = saveContainer.FaceFileHolder.Name; + else + description = saveContainer.ResizedFileHolder.Name; windowsShortcut = new() { Path = saveContainer.ResizedFileHolder.FullName, Description = description }; windowsShortcut.Save(saveContainer.ShortcutFile); windowsShortcut.Dispose(); @@ -307,6 +316,8 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic { } if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && configuration.LocationContainerDistanceTolerance is not null) Stateless.MapLogic.SaveMappedRelations(configuration, distance, a2PeopleContentDirectory, eDistanceContentDirectory, ticks, locationContainers, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection); + if (!string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) + throw new Exception($"{nameof(configuration.LocationContainerDebugDirectory)} is not IsNullOrEmpty!"); } _PersonKeyToCount = readOnlyPersonKeyToCount; _EDistanceContentTicksDirectory = eDistanceContentTicksDirectory; @@ -469,7 +480,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic return (ticks, directory); } - private static bool PreAndPostContinue(Configuration configuration, ReadOnlyDictionary> idToWholePercentagesToMapping, Sorting sorting, Mapping mapping, Mapping keyMapping) + private static bool PreAndPostContinue(Configuration configuration, Mapping mapping, Mapping keyMapping) { bool result = true; if (result && mapping.MappingFromFilterPre.InSkipCollection is not null && mapping.MappingFromFilterPre.InSkipCollection.Value) @@ -493,13 +504,15 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic return result; } - private (string?, long?, string) Get(Configuration configuration, bool saveIndividually, string by, Mapping question, int padLeft) + private Record Get(Configuration configuration, bool saveIndividually, string by, Mapping question, int padLeft) { long? ticks; string? directory; + string? debugDirectory; string personDirectory; if (question.MappingFromPerson is null) { + debugDirectory = null; (ticks, directory) = GetDirectory(configuration, saveIndividually, padLeft, question.SegmentC, by, question.MappingFromItem); personDirectory = directory is null ? string.Empty : Path.Combine(directory, $"X+{ticks}"); } @@ -507,34 +520,34 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic { ticks = null; string personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, question.MappingFromPerson.PersonKey); + debugDirectory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, question.MappingFromPerson.DisplayDirectoryName); if (string.IsNullOrEmpty(question.SegmentC)) directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, question.MappingFromPerson.SegmentB); - else if (saveIndividually) - directory = Path.Combine(_EDistanceContentTicksDirectory, by, question.SegmentC.PadLeft(padLeft, '0'), personKeyFormatted, question.MappingFromPerson.SegmentB); + else if (!saveIndividually) + directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, $"Z-{question.MappingFromPerson.SegmentB}-{question.SegmentC}"); else - directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, question.MappingFromPerson.SegmentB, question.SegmentC); + directory = Path.Combine(_EDistanceContentTicksDirectory, by, question.SegmentC.PadLeft(padLeft, '0'), personKeyFormatted, question.MappingFromPerson.SegmentB); personDirectory = Path.Combine(directory, question.MappingFromPerson.DisplayDirectoryName, "lnk"); } - return (directory, ticks, personDirectory); + return new(debugDirectory, directory, ticks, personDirectory); } - private List GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyCollection mappingCollection, ReadOnlyDictionary> idToWholePercentagesToMapping, ReadOnlyDictionary> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny) + private List GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, ReadOnlyCollection mappingCollection, ReadOnlyDictionary> idToWholePercentagesToMapping, ReadOnlyDictionary> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); List results = new(); string by; - long? ticks; + Record record; List? ids; bool isByMapping; bool isBySorting; Sorting? sorting; string checkFile; - string? directory; Mapping? question; + string? directory; string shortcutFile; string facesDirectory; - string personDirectory; FileHolder faceFileHolder; string facePartsDirectory; SaveContainer? saveContainer; @@ -569,12 +582,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic throw new NotSupportedException(); if (!wholePercentagesToMapping.TryGetValue(sorting.WholePercentages, out question)) throw new NotSupportedException(); - if (!PreAndPostContinue(_Configuration, idToWholePercentagesToMapping, sorting, mapping, question)) + if (!PreAndPostContinue(_Configuration, mapping, question)) continue; } - (directory, ticks, personDirectory) = Get(_Configuration, saveIndividually, by, mapping, padLeft); - if (string.IsNullOrEmpty(directory)) + record = Get(_Configuration, saveIndividually, by, mapping, padLeft); + if (string.IsNullOrEmpty(record.Directory)) throw new NotSupportedException(); + directory = record.Directory; if (mapping.MappingFromPerson is not null) { if (saveIndividually) @@ -589,15 +603,15 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic { if (!_Configuration.SaveSortingWithoutPerson) continue; - if (ticks is null) + if (record.Ticks is null) continue; if (saveIndividually) { directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString()); - results.Add(new(Path.Combine(directory, $"X+{ticks}"))); + results.Add(new(Path.Combine(directory, $"X+{record.Ticks}"))); } } - results.Add(new(personDirectory)); + results.Add(new(record.PersonDirectory)); if (question is not null) { if (question.MappingFromLocation is null) @@ -611,7 +625,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic continue; if (isByMapping) { - checkFile = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); + checkFile = Path.Combine(record.PersonDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); saveContainer = new(checkFile, directory, faceFileHolder); } else if (saveIndividually) @@ -625,7 +639,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic else { facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); - shortcutFile = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); + shortcutFile = Path.Combine(record.PersonDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); @@ -644,7 +658,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic bool saveMapped = true; int? useFiltersCounter = null; string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping)); - List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false); + List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false); SaveContainers(updated, saveContainers); if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory)) Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); @@ -759,14 +773,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic } List results = new(); string by; - long? ticks; + Record record; bool isBySorting; string checkFile; Mapping? question; string? directory; string shortcutFile; string facesDirectory; - string personDirectory; bool isCounterPersonYear; string facePartsDirectory; FileHolder? faceFileHolder; @@ -786,9 +799,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic throw new NotSupportedException(); if (question.MappingFromLocation is null) continue; - (directory, ticks, personDirectory) = Get(_Configuration, _Configuration.SaveIndividually, by, question, padLeft); - if (string.IsNullOrEmpty(directory)) + record = Get(_Configuration, _Configuration.SaveIndividually, by, question, padLeft); + if (string.IsNullOrEmpty(record.Directory)) throw new NotSupportedException(); + directory = record.Directory; + if (!string.IsNullOrEmpty(record.DebugDirectory)) + results.Add(new(record.DebugDirectory)); if (question.MappingFromPerson is not null) { if (_Configuration.SaveIndividually) @@ -801,21 +817,21 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic { if (!_Configuration.SaveSortingWithoutPerson) throw new NotSupportedException(); - if (ticks is null) + if (record.Ticks is null) continue; if (_Configuration.SaveIndividually) { directory = Path.Combine(directory, question.MappingFromItem.Id.ToString()); - results.Add(new(Path.Combine(directory, $"X+{ticks}"))); + results.Add(new(Path.Combine(directory, $"X+{record.Ticks}"))); } } - results.Add(new(personDirectory)); + results.Add(new(record.PersonDirectory)); if (_Configuration.SaveIndividually && question.MappingFromLocation.WholePercentages == question.MappingFromLocation.WholePercentages) results.Add(new(Path.Combine(directory, "Maybe"))); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, question.MappingFromItem); faceFileHolder = new(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, question.MappingFromItem); - shortcutFile = Path.Combine(personDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); + shortcutFile = Path.Combine(record.PersonDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); checkFile = Path.Combine(directory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}"); hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); @@ -893,7 +909,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic throw new NotSupportedException(nameof(GetSortingCollection)); if (keyMapping.MappingFromFilterPost.CanReMap is not null && !keyMapping.MappingFromFilterPost.CanReMap.Value) throw new NotSupportedException(nameof(GetSortingCollection)); - if (!PreAndPostContinue(_Configuration, idToWholePercentagesToMapping, sorting, sortingContainer.Source, keyMapping)) + if (!PreAndPostContinue(_Configuration, sortingContainer.Source, keyMapping)) continue; if (!idToWholePercentagesCollection.TryGetValue(sorting.Id, out wholePercentagesCollection)) { diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index bd68b8a..d29a4eb 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -16,13 +16,13 @@ internal abstract class MapLogic internal record Record(string PersonKeyFormatted, int DirectoryNumber, - string PersonDisplayDirectoryName, - bool IsDefault, + string? PersonDisplayDirectoryName, + bool? IsDefault, string MappedFaceFile); internal record MappedFile(long PersonKey, string PersonKeyFormatted, - string PersonDisplayDirectoryName, + string? PersonDisplayDirectoryName, int? DirectoryNumber, string File); @@ -38,8 +38,8 @@ internal abstract class MapLogic float? TotalDays); internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted, - string PersonDisplayDirectoryName, - bool IsDefault, + string? PersonDisplayDirectoryName, + bool? IsDefault, string MappedFaceFile, int Id, int WholePercentages); @@ -335,7 +335,7 @@ internal abstract class MapLogic if (directoryInfo.LastWriteTime.Ticks != directoryTicks) Directory.SetLastWriteTime(ticksDirectory, new DateTime(directoryTicks)); totalDays = lastDirectoryTicks is null || new TimeSpan(dateTime.Ticks - directoryTicks).TotalDays < 1 ? null : (float)new TimeSpan(directoryTicks - lastDirectoryTicks.Value).TotalDays; - results.Add(new(ticksDirectory, ticksDirectoryName, new(directoryTicks), new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day + 1), totalDays)); + results.Add(new(ticksDirectory, ticksDirectoryName, new(directoryTicks), new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day).AddMonths(1), totalDays)); if (directoryDateTime.Hour == 0 && directoryDateTime.Minute == 0 && directoryDateTime.Second == 0) continue; lastDirectoryTicks = directoryTicks; @@ -641,6 +641,7 @@ internal abstract class MapLogic string[] fileMatches; const string lnk = ".lnk"; int? id, wholePercentages; + string personDisplayDirectoryName; const bool fromDistanceContent = true; IReadOnlyList directories; List<(string File, int WholePercentages)>? wholePercentagesCollection; @@ -650,7 +651,7 @@ internal abstract class MapLogic (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File[..^4]); if (id is null || wholePercentages is null) return; - if (skipCollection.TryGetValue(id.Value, out wholePercentagesCollection)) + if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection)) { fileMatches = (from l in wholePercentagesCollection where l.WholePercentages == wholePercentages select l.File).ToArray(); foreach (string fileMatch in fileMatches) @@ -669,8 +670,9 @@ internal abstract class MapLogic else directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.File); RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); + personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; lock (locationContainers) - locationContainers.Add(new(fromDistanceContent, mappedFile.DirectoryNumber, mappedFile.File, mappedFile.PersonKey, mappedFile.PersonDisplayDirectoryName, id.Value, wholePercentages.Value, directories, rectangle, null)); + locationContainers.Add(new(fromDistanceContent, mappedFile.DirectoryNumber, mappedFile.File, mappedFile.PersonKey, personDisplayDirectoryName, id.Value, wholePercentages.Value, directories, rectangle, null)); } private static void LookForPossibleDuplicates(Configuration configuration, ReadOnlyCollection> locationContainers) @@ -870,21 +872,46 @@ internal abstract class MapLogic } } - internal static List DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection personKeyFormattedCollection) + private static List GetRecords(Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List distinct, string? personDisplayDirectoryName) { List results = new(); int? id; + string fileName; + string checkFile; + int? wholePercentages; + foreach (string mappedFaceFile in files) + { + if (mappedFaceFile.EndsWith(".lnk")) + continue; + (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile); + if (id is null || wholePercentages is null) + continue; + fileName = Path.GetFileName(mappedFaceFile); + if (distinct.Contains(fileName)) + { + checkFile = $"{mappedFaceFile}.dup"; + if (File.Exists(checkFile)) + continue; + File.Move(mappedFaceFile, checkFile); + continue; + } + distinct.Add(fileName); + results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile)); + } + return results; + } + + internal static List DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection personKeyFormattedCollection) + { + List results = new(); bool check; - bool isDefault; string message; string[] files; - string fileName; + bool? isDefault; int totalSeconds; - string checkFile; DateTime dateTime; TimeSpan timeSpan; int directoryNumber; - int? wholePercentages; string? checkDirectory; ProgressBar progressBar; string[] yearDirectories; @@ -894,7 +921,7 @@ internal abstract class MapLogic List distinct = new(); string[] personNameDirectories; string? newestPersonKeyFormatted; - string personDisplayDirectoryName; + string? personDisplayDirectoryName; string[] personNameLinkDirectories; string? personFirstInitialDirectory; List ticksDirectories; @@ -938,16 +965,32 @@ internal abstract class MapLogic { if (check && !Directory.Exists(yearDirectory)) continue; - files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); + if (ticksDirectory.DirectoryName != configuration.LocationContainerDebugDirectory) + { + files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string file in files) + File.Delete(file); + } + if (ticksDirectory.DirectoryName == configuration.LocationContainerDebugDirectory) + { + isDefault = null; + personDisplayDirectoryName = null; + files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); + results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName)); + files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories); + foreach (string file in files) + File.Delete(file); + continue; + } personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly); - foreach (string file in files) - File.Delete(file); + if (personNameDirectories.Length > 1) + throw new NotSupportedException(); foreach (string personNameDirectory in personNameDirectories) { directoryNumber++; personDisplayDirectoryName = Path.GetFileName(personNameDirectory); isDefault = IPerson.IsDefaultName(personDisplayDirectoryName) && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]); - if (isDefault && personDisplayDirectoryName.Length == 1) + if (isDefault.Value && personDisplayDirectoryName.Length == 1) { if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) continue; @@ -962,7 +1005,7 @@ internal abstract class MapLogic check = true; continue; } - if (isDefault && (ticksDirectory.DirectoryDateTime.Hour != 0 || ticksDirectory.DirectoryDateTime.Minute != 0 || ticksDirectory.DirectoryDateTime.Second != 0)) + if (isDefault.Value && (ticksDirectory.DirectoryDateTime.Hour != 0 || ticksDirectory.DirectoryDateTime.Minute != 0 || ticksDirectory.DirectoryDateTime.Second != 0)) { checkDirectory = Path.GetDirectoryName(ticksDirectory.Directory); if (checkDirectory is null) @@ -986,7 +1029,7 @@ internal abstract class MapLogic throw new Exception($"Move personKey directories up one from {manualCopyHumanized} and delete {manualCopyHumanized} directory!"); if (personKeyFormatted == forceSingleImageHumanized && files.Length > 0) throw new Exception($"Move personKey directories up one from {forceSingleImageHumanized} and delete {forceSingleImageHumanized} directory!"); - if (!isDefault) + if (!isDefault.Value) { if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null) RenameUnknown(files); @@ -1000,7 +1043,7 @@ internal abstract class MapLogic } if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length) continue; - if (personDisplayDirectoryName.Length == 1 || isDefault || !personKeyFormattedCollection.Contains(personKeyFormatted)) + if (personDisplayDirectoryName.Length == 1 || isDefault.Value || !personKeyFormattedCollection.Contains(personKeyFormatted)) personFirstInitialDirectory = personNameDirectory; else { @@ -1021,25 +1064,7 @@ internal abstract class MapLogic Directory.Move(personNameDirectory, personFirstInitialDirectory); files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); } - foreach (string mappedFaceFile in files) - { - if (mappedFaceFile.EndsWith(".lnk")) - continue; - (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile); - if (id is null || wholePercentages is null) - continue; - fileName = Path.GetFileName(mappedFaceFile); - if (distinct.Contains(fileName)) - { - checkFile = $"{mappedFaceFile}.dup"; - if (File.Exists(checkFile)) - continue; - File.Move(mappedFaceFile, checkFile); - continue; - } - distinct.Add(fileName); - results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile)); - } + results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName)); personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personNameLinkDirectory in personNameLinkDirectories) { @@ -1083,6 +1108,7 @@ internal abstract class MapLogic char status, sex, first; PersonDirectory personDirectory; PersonContainer? personContainer; + string personDisplayDirectoryName; foreach (PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages in personKeyFormattedIdThenWholePercentagesCollection) { personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormattedIdThenWholePercentages.PersonKeyFormatted); @@ -1090,13 +1116,14 @@ internal abstract class MapLogic throw new Exception(); if (!personKeyFormattedToPersonContainer.TryGetValue(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, out personContainer)) { - matches = configuration.PersonCharacters.Where(l => personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName.Contains(l)).ToArray(); + personDisplayDirectoryName = personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName; + matches = configuration.PersonCharacters.Where(l => personDisplayDirectoryName.Contains(l)).ToArray(); if (matches.Length == 0) throw new NotSupportedException(); group = IPerson.GetHourGroup(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour); (status, sex, first) = IPerson.GetPersonHour(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour); personDirectory = new(matches.First(), group, status, sex, first); - personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personDirectory); + personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory); personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer); } if (personContainer.Key is null) @@ -1280,8 +1307,11 @@ internal abstract class MapLogic ParallelFor(configuration, skipCollection, results, mappedFiles[i]); }); } - ReadOnlyCollection> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray()); - LookForPossibleDuplicates(configuration, locationContainers); + if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) + { + ReadOnlyCollection> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray()); + LookForPossibleDuplicates(configuration, locationContainers); + } return results; } @@ -1785,6 +1815,39 @@ internal abstract class MapLogic return result; } + private static void AddDisplayDirectoryNames(Configuration configuration, string eDistanceContentDirectory, ReadOnlyDictionary readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyCollection>> collections) + { + bool isCounterPersonYear; + string personKeyFormatted; + string? displayDirectoryName; + string? checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory); + _ = IPath.DeleteEmptyDirectories(checkDirectory); + foreach (ReadOnlyCollection> collection in collections) + { + if (configuration.LocationContainerDistanceTolerance is null) + break; + isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year); + if (isCounterPersonYear) + continue; + personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey); + checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted); + if (!Directory.Exists(checkDirectory)) + continue; + displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted); + if (string.IsNullOrEmpty(displayDirectoryName)) + continue; + foreach (string yearDirectory in Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly)) + { + checkDirectory = Path.Combine(yearDirectory, displayDirectoryName); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + } + checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted, displayDirectoryName); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + } + } + internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List> locationContainers, ReadOnlyDictionary readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary> readOnlyPersonKeyToPersonContainerCollection) { bool isCounterPersonYear; @@ -1802,11 +1865,13 @@ internal abstract class MapLogic progressBar.Tick(); if (collection.Count == 0) continue; - personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey); isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year); + personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey); displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted); - distance.SaveMappedForOutputResolutions(a2PeopleContentDirectory, eDistanceContentDirectory, configuration.LocationContainerDistanceTolerance.Value, collection, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName); + distance.SaveMappedForOutputResolutions(configuration.LocationContainerDebugDirectory, a2PeopleContentDirectory, eDistanceContentDirectory, configuration.LocationContainerDistanceTolerance.Value, collection, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName); } + if (!string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) + AddDisplayDirectoryNames(configuration, eDistanceContentDirectory, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection, collections); } internal static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation) diff --git a/Shared/Models/Methods/IDistance.cs b/Shared/Models/Methods/IDistance.cs index bce8852..2d4efa7 100644 --- a/Shared/Models/Methods/IDistance.cs +++ b/Shared/Models/Methods/IDistance.cs @@ -5,6 +5,6 @@ namespace View_by_Distance.Shared.Models.Methods; public interface IDistance { - void SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName); + void SaveMappedForOutputResolutions(string locationContainerDebugDirectory, string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IPerson.cs b/Shared/Models/Stateless/Methods/IPerson.cs index 1aa3e8e..7e26d31 100644 --- a/Shared/Models/Stateless/Methods/IPerson.cs +++ b/Shared/Models/Stateless/Methods/IPerson.cs @@ -5,7 +5,7 @@ public interface IPerson // ... - static (char, char, char) GetPersonHour(string personDisplayDirectoryName, int hour) => + static (char, char, char) GetPersonHour(string? personDisplayDirectoryName, int hour) => hour == 0 ? new('U', 'U', 'U') : hour == 1 ? new('U', 'U', 'U') : hour == 2 ? new('U', 'U', 'U') : @@ -21,7 +21,7 @@ public interface IPerson hour == 17 ? new('D', 'M', 'N') : throw new NotImplementedException(personDisplayDirectoryName); - static string GetHourGroup(string personDisplayDirectoryName, int hour) => + static string GetHourGroup(string? personDisplayDirectoryName, int hour) => hour == 0 ? "Unknown-Unknown-Unknown" : hour == 1 ? "Unknown-Unknown-Unknown" : hour == 2 ? "Unknown-Unknown-Unknown" : diff --git a/Tests/UnitTestHardCoded.cs b/Tests/UnitTestHardCoded.cs index adfc81a..76bb18b 100644 --- a/Tests/UnitTestHardCoded.cs +++ b/Tests/UnitTestHardCoded.cs @@ -83,7 +83,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodDel() { - string directory = "F:/Tmp/Phares/Compare/Images 2022-09-15 - 7390c13 - III - Results/E) Distance/2022-09-15/7680 x 4320/7680x4320 - Hog - Large/()/(637992984751968513)"; + string directory = "F:/Tmp/Phares/Compare/Images 2022-09-15 - 7390c13 - III - Results/E)Distance/2022-09-15/7680 x 4320/7680x4320 - Hog - Large/()/(637992984751968513)"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { for (int i = 1; i < 11; i++) @@ -96,7 +96,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodGetApproximateYears() { - string personDisplayDirectory = "D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/{}/^/Sydney Dupray^9"; + string personDisplayDirectory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/{}/^/Sydney Dupray^9"; if (Directory.Exists(Directory.GetDirectoryRoot(personDisplayDirectory)) && Directory.Exists(personDisplayDirectory)) { char numberSign = '#'; @@ -120,7 +120,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodDel2() { - string directory = "F:/Tmp/Phares/Compare/Images 2022-09-15 - 7390c13 - III - Results/E) Distance/2022-09-15/7680 x 4320/7680x4320 - Hog - Large/()/(637992984751968513)"; + string directory = "F:/Tmp/Phares/Compare/Images 2022-09-15 - 7390c13 - III - Results/E)Distance/2022-09-15/7680 x 4320/7680x4320 - Hog - Large/()/(637992984751968513)"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { for (int i = 1; i < 11; i++) @@ -199,7 +199,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodRenameAbandoned() { - string directory = "D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/{}/!/Abandoned"; + string directory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/{}/!/Abandoned"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { string checkFile; @@ -219,7 +219,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodRenameDelete() { - string directory = "D:/1-Images-A/Images-dd514b88-Results/A) Property/dd514b88/{}"; + string directory = "D:/1-Images-A/Images-dd514b88-Results/A)Property/dd514b88/{}"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { string checkFile; @@ -239,7 +239,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodRenameOld() { - string directory = "D:/2-Images-B/Not-Copy-Copy-dd514b88-Results/E) Distance/dd514b88/()"; + string directory = "D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/()"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { string checkFile; @@ -256,6 +256,41 @@ public partial class UnitTestHardCoded NonThrowTryCatch(); } + [TestMethod] + public void TestMethodRenameDup() + { + string directory; + directory = "D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/()"; + if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) + { + string checkFile; + string[] files = Directory.GetFiles(directory, "*.dup", SearchOption.AllDirectories); + foreach (string file in files) + { + checkFile = file[..^4]; + if (File.Exists(checkFile)) + continue; + File.Move(file, checkFile); + } + Assert.IsTrue(true); + } + directory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/{}/!"; + if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) + { + string checkFile; + string[] files = Directory.GetFiles(directory, "*.dup", SearchOption.AllDirectories); + foreach (string file in files) + { + checkFile = file[..^4]; + if (File.Exists(checkFile)) + continue; + File.Move(file, checkFile); + } + Assert.IsTrue(true); + } + NonThrowTryCatch(); + } + [TestMethod] public void TestMethodRename() { @@ -278,7 +313,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodRenameForUnkown() { - string directory = "D:/1-Images-A/Images-dd514b88-Results/E) Distance/dd514b88/(RectInt-2023-06-19-less-0.99)"; + string directory = "D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/(RectInt-2023-06-19-less-0.99)"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { string[] files = Directory.GetFiles(directory, "*.unk", SearchOption.AllDirectories); @@ -291,7 +326,7 @@ public partial class UnitTestHardCoded [TestMethod] public void TestMethodRenameForTicks() { - string directory = "D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/([])/ged"; + string directory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/([])/ged"; if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) { string checkName;