LocationContainerDebugDirectory

This commit is contained in:
Mike Phares 2023-09-08 23:22:55 -07:00
parent 8d759ccefd
commit 331d98793e
10 changed files with 264 additions and 94 deletions

View File

@ -503,12 +503,14 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
} }
private static void MoveFiles(Dictionary<string, int> keyValuePairs, List<string> linkedOnce, List<string> linkedTwice, List<string> linkedThrice) private static void MoveFiles(string locationContainerDebugDirectory, bool isCounterPersonYear, string? displayDirectoryName, Dictionary<string, int> keyValuePairs, List<string> linkedOnce, List<string> linkedTwice, List<string> linkedThrice, List<string> linkedFour, List<string> linkedFive)
{ {
string checkFile; string checkFile;
string debugFile;
string checkDirectory; string checkDirectory;
string? yearDirectory; string? yearDirectory;
string? personNameDirectory; string? personNameDirectory;
string? maybeTicksDirectoryName;
string? personNameDirectoryName; string? personNameDirectoryName;
string? personKeyFormattedDirectory; string? personKeyFormattedDirectory;
foreach (string file in linkedOnce) foreach (string file in linkedOnce)
@ -517,28 +519,60 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
keyValuePairs[file] += 1; keyValuePairs[file] += 1;
foreach (string file in linkedThrice) foreach (string file in linkedThrice)
keyValuePairs[file] += 1; keyValuePairs[file] += 1;
foreach (string file in linkedFour)
keyValuePairs[file] += 1;
foreach (string file in linkedFive)
keyValuePairs[file] += 1;
foreach (KeyValuePair<string, int> keyValuePair in keyValuePairs) foreach (KeyValuePair<string, int> keyValuePair in keyValuePairs)
{ {
personNameDirectory = Path.GetDirectoryName(keyValuePair.Key); personNameDirectory = Path.GetDirectoryName(keyValuePair.Key);
yearDirectory = Path.GetDirectoryName(personNameDirectory); yearDirectory = Path.GetDirectoryName(personNameDirectory);
personNameDirectoryName = Path.GetFileName(personNameDirectory); personNameDirectoryName = Path.GetFileName(personNameDirectory);
personKeyFormattedDirectory = Path.GetDirectoryName(yearDirectory); personKeyFormattedDirectory = Path.GetDirectoryName(yearDirectory);
maybeTicksDirectoryName = Path.GetFileName(personKeyFormattedDirectory);
if (string.IsNullOrEmpty(personNameDirectory) || string.IsNullOrEmpty(yearDirectory) || string.IsNullOrEmpty(personKeyFormattedDirectory) || string.IsNullOrEmpty(personNameDirectoryName)) if (string.IsNullOrEmpty(personNameDirectory) || string.IsNullOrEmpty(yearDirectory) || string.IsNullOrEmpty(personKeyFormattedDirectory) || string.IsNullOrEmpty(personNameDirectoryName))
continue; continue;
checkDirectory = Path.Combine(personKeyFormattedDirectory, $"{keyValuePair.Value}{new string(Convert.ToChar(65 + keyValuePair.Value), 7)}"); if (maybeTicksDirectoryName == locationContainerDebugDirectory)
if (checkDirectory == yearDirectory) 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; continue;
checkDirectory = Path.Combine(checkDirectory, personNameDirectoryName);
if (!Directory.Exists(checkDirectory)) if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory); _ = Directory.CreateDirectory(checkDirectory);
checkFile = Path.Combine(checkDirectory, Path.GetFileName(keyValuePair.Key)); checkFile = Path.Combine(checkDirectory, Path.GetFileName(keyValuePair.Key));
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Move(keyValuePair.Key, checkFile); 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<Record> records, string directory) private static void SaveMappedForOutputResolutions(string locationContainerDebugDirectory, string eDistanceContentDirectory, float distanceTolerance, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, List<Record> records, string directory)
{ {
int years; int years;
string text; string text;
@ -547,6 +581,8 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
List<string> files = new(); List<string> files = new();
List<string> lines = new(); List<string> lines = new();
List<Mapped> results = new(); List<Mapped> results = new();
List<string> linkedFive = new();
List<string> linkedFour = new();
List<string> linkedOnce = new(); List<string> linkedOnce = new();
long ticks = DateTime.Now.Ticks; long ticks = DateTime.Now.Ticks;
string fileNameWithoutExtension; string fileNameWithoutExtension;
@ -606,6 +642,16 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
linkedThrice.Add(mapped.File); linkedThrice.Add(mapped.File);
continue; continue;
} }
if (!linkedFour.Contains(mapped.File))
{
linkedFour.Add(mapped.File);
continue;
}
if (!linkedFive.Contains(mapped.File))
{
linkedFive.Add(mapped.File);
continue;
}
} }
if (isCounterPersonYear) if (isCounterPersonYear)
(years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(ticks, fileInfo.CreationTime.Ticks); (years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(ticks, fileInfo.CreationTime.Ticks);
@ -633,10 +679,10 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
if (!Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(directory, $"{fileNameWithoutExtension}.md"), text, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null)) if (!Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(directory, $"{fileNameWithoutExtension}.md"), text, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null))
continue; continue;
} }
MoveFiles(keyValuePairs, linkedOnce, linkedTwice, linkedThrice); MoveFiles(locationContainerDebugDirectory, isCounterPersonYear, displayDirectoryName, keyValuePairs, linkedOnce, linkedTwice, linkedThrice, linkedFour, linkedFive);
} }
void IDistance<MetadataExtractor.Directory>.SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName) void IDistance<MetadataExtractor.Directory>.SaveMappedForOutputResolutions(string locationContainerDebugDirectory, string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName)
{ {
string? json; string? json;
List<Record> records = new(); List<Record> records = new();
@ -659,7 +705,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
if (records.Count > 0) if (records.Count > 0)
{ {
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory); 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); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(directory);
} }

View File

@ -170,6 +170,8 @@ public partial class DlibDotNet
throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermyriadTolerance)); throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermyriadTolerance));
if (configuration.RangeFaceConfidence.Length != 3) if (configuration.RangeFaceConfidence.Length != 3)
throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); 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]); _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]);
if (configuration.OutputResolutions.Length == 0 || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) 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!"); throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be fileNameToCollection valid outputResolution!");
@ -840,6 +842,7 @@ public partial class DlibDotNet
configuration.DistanceRenameToMatch, configuration.DistanceRenameToMatch,
configuration.FaceConfidencePercent, configuration.FaceConfidencePercent,
configuration.FaceDistancePermyriad, configuration.FaceDistancePermyriad,
configuration.LocationContainerDebugDirectory,
configuration.LocationContainerDistanceTolerance, configuration.LocationContainerDistanceTolerance,
configuration.LocationDigits, configuration.LocationDigits,
configuration.MappingDefaultName, configuration.MappingDefaultName,

View File

@ -32,6 +32,7 @@ public class Configuration
public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; }
public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; }
public bool? LoadPhotoPrismLocations { get; set; } public bool? LoadPhotoPrismLocations { get; set; }
public string? LocationContainerDebugDirectory { get; set; }
public float? LocationContainerDistanceTolerance { get; set; } public float? LocationContainerDistanceTolerance { get; set; }
public int? LocationDigits { get; set; } public int? LocationDigits { get; set; }
public int? LocationFactor { 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?.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions));
// if (configuration?.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)); // if (configuration?.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions));
if (configuration?.LoadPhotoPrismLocations is null) throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); 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?.LocationContainerDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTolerance));
if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits));
if (configuration?.LocationFactor is null) throw new NullReferenceException(nameof(configuration.LocationFactor)); if (configuration?.LocationFactor is null) throw new NullReferenceException(nameof(configuration.LocationFactor));
@ -215,6 +217,7 @@ public class Configuration
configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ?? Array.Empty<string>(), configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ?? Array.Empty<string>(),
configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ?? Array.Empty<string>(), configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ?? Array.Empty<string>(),
configuration.LoadPhotoPrismLocations.Value, configuration.LoadPhotoPrismLocations.Value,
configuration.LocationContainerDebugDirectory,
configuration.LocationContainerDistanceTolerance, configuration.LocationContainerDistanceTolerance,
configuration.LocationDigits.Value, configuration.LocationDigits.Value,
configuration.LocationFactor.Value, configuration.LocationFactor.Value,

View File

@ -26,6 +26,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration,
string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions,
string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions,
bool LoadPhotoPrismLocations, bool LoadPhotoPrismLocations,
string LocationContainerDebugDirectory,
float? LocationContainerDistanceTolerance, float? LocationContainerDistanceTolerance,
int LocationDigits, int LocationDigits,
int LocationFactor, int LocationFactor,

View File

@ -5,6 +5,7 @@ public record Configuration(bool DeletePossibleDuplicates,
bool DistanceRenameToMatch, bool DistanceRenameToMatch,
int FaceConfidencePercent, int FaceConfidencePercent,
int FaceDistancePermyriad, int FaceDistancePermyriad,
string LocationContainerDebugDirectory,
float? LocationContainerDistanceTolerance, float? LocationContainerDistanceTolerance,
int LocationDigits, int LocationDigits,
string MappingDefaultName, string MappingDefaultName,

View File

@ -18,6 +18,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
[GeneratedRegex("[\\\\,\\/,\\:,\\*,\\?,\\\",\\<,\\>,\\|]")] [GeneratedRegex("[\\\\,\\/,\\:,\\*,\\?,\\\",\\<,\\>,\\|]")]
private static partial Regex FileSystemSafe(); private static partial Regex FileSystemSafe();
internal record Record(string? DebugDirectory,
string? Directory,
long? Ticks,
string PersonDirectory);
public void SaveContainers(int? updated, List<SaveContainer> saveContainers) public void SaveContainers(int? updated, List<SaveContainer> saveContainers)
{ {
if (_Configuration is null) if (_Configuration is null)
@ -116,7 +121,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
try 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 = new() { Path = saveContainer.ResizedFileHolder.FullName, Description = description };
windowsShortcut.Save(saveContainer.ShortcutFile); windowsShortcut.Save(saveContainer.ShortcutFile);
windowsShortcut.Dispose(); windowsShortcut.Dispose();
@ -307,6 +316,8 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
{ } { }
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && configuration.LocationContainerDistanceTolerance is not null) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && configuration.LocationContainerDistanceTolerance is not null)
Stateless.MapLogic.SaveMappedRelations(configuration, distance, a2PeopleContentDirectory, eDistanceContentDirectory, ticks, locationContainers, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection); 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; _PersonKeyToCount = readOnlyPersonKeyToCount;
_EDistanceContentTicksDirectory = eDistanceContentTicksDirectory; _EDistanceContentTicksDirectory = eDistanceContentTicksDirectory;
@ -469,7 +480,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
return (ticks, directory); return (ticks, directory);
} }
private static bool PreAndPostContinue(Configuration configuration, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, Sorting sorting, Mapping mapping, Mapping keyMapping) private static bool PreAndPostContinue(Configuration configuration, Mapping mapping, Mapping keyMapping)
{ {
bool result = true; bool result = true;
if (result && mapping.MappingFromFilterPre.InSkipCollection is not null && mapping.MappingFromFilterPre.InSkipCollection.Value) 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; 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; long? ticks;
string? directory; string? directory;
string? debugDirectory;
string personDirectory; string personDirectory;
if (question.MappingFromPerson is null) if (question.MappingFromPerson is null)
{ {
debugDirectory = null;
(ticks, directory) = GetDirectory(configuration, saveIndividually, padLeft, question.SegmentC, by, question.MappingFromItem); (ticks, directory) = GetDirectory(configuration, saveIndividually, padLeft, question.SegmentC, by, question.MappingFromItem);
personDirectory = directory is null ? string.Empty : Path.Combine(directory, $"X+{ticks}"); 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; ticks = null;
string personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, question.MappingFromPerson.PersonKey); string personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, question.MappingFromPerson.PersonKey);
debugDirectory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, question.MappingFromPerson.DisplayDirectoryName);
if (string.IsNullOrEmpty(question.SegmentC)) if (string.IsNullOrEmpty(question.SegmentC))
directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, question.MappingFromPerson.SegmentB); directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, question.MappingFromPerson.SegmentB);
else if (saveIndividually) else if (!saveIndividually)
directory = Path.Combine(_EDistanceContentTicksDirectory, by, question.SegmentC.PadLeft(padLeft, '0'), personKeyFormatted, question.MappingFromPerson.SegmentB); directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, $"Z-{question.MappingFromPerson.SegmentB}-{question.SegmentC}");
else 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"); personDirectory = Path.Combine(directory, question.MappingFromPerson.DisplayDirectoryName, "lnk");
} }
return (directory, ticks, personDirectory); return new(debugDirectory, directory, ticks, personDirectory);
} }
private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, ReadOnlyDictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny) private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, ReadOnlyDictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
List<SaveContainer> results = new(); List<SaveContainer> results = new();
string by; string by;
long? ticks; Record record;
List<int>? ids; List<int>? ids;
bool isByMapping; bool isByMapping;
bool isBySorting; bool isBySorting;
Sorting? sorting; Sorting? sorting;
string checkFile; string checkFile;
string? directory;
Mapping? question; Mapping? question;
string? directory;
string shortcutFile; string shortcutFile;
string facesDirectory; string facesDirectory;
string personDirectory;
FileHolder faceFileHolder; FileHolder faceFileHolder;
string facePartsDirectory; string facePartsDirectory;
SaveContainer? saveContainer; SaveContainer? saveContainer;
@ -569,12 +582,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
throw new NotSupportedException(); throw new NotSupportedException();
if (!wholePercentagesToMapping.TryGetValue(sorting.WholePercentages, out question)) if (!wholePercentagesToMapping.TryGetValue(sorting.WholePercentages, out question))
throw new NotSupportedException(); throw new NotSupportedException();
if (!PreAndPostContinue(_Configuration, idToWholePercentagesToMapping, sorting, mapping, question)) if (!PreAndPostContinue(_Configuration, mapping, question))
continue; continue;
} }
(directory, ticks, personDirectory) = Get(_Configuration, saveIndividually, by, mapping, padLeft); record = Get(_Configuration, saveIndividually, by, mapping, padLeft);
if (string.IsNullOrEmpty(directory)) if (string.IsNullOrEmpty(record.Directory))
throw new NotSupportedException(); throw new NotSupportedException();
directory = record.Directory;
if (mapping.MappingFromPerson is not null) if (mapping.MappingFromPerson is not null)
{ {
if (saveIndividually) if (saveIndividually)
@ -589,15 +603,15 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
{ {
if (!_Configuration.SaveSortingWithoutPerson) if (!_Configuration.SaveSortingWithoutPerson)
continue; continue;
if (ticks is null) if (record.Ticks is null)
continue; continue;
if (saveIndividually) if (saveIndividually)
{ {
directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString()); 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 is not null)
{ {
if (question.MappingFromLocation is null) if (question.MappingFromLocation is null)
@ -611,7 +625,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
if (isByMapping) 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); saveContainer = new(checkFile, directory, faceFileHolder);
} }
else if (saveIndividually) else if (saveIndividually)
@ -625,7 +639,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
else else
{ {
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); 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}"); 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}")); 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}")); 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; bool saveMapped = true;
int? useFiltersCounter = null; int? useFiltersCounter = null;
string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping)); string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping));
List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false); List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false);
SaveContainers(updated, saveContainers); SaveContainers(updated, saveContainers);
if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory)) if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory))
Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory);
@ -759,14 +773,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
} }
List<SaveContainer> results = new(); List<SaveContainer> results = new();
string by; string by;
long? ticks; Record record;
bool isBySorting; bool isBySorting;
string checkFile; string checkFile;
Mapping? question; Mapping? question;
string? directory; string? directory;
string shortcutFile; string shortcutFile;
string facesDirectory; string facesDirectory;
string personDirectory;
bool isCounterPersonYear; bool isCounterPersonYear;
string facePartsDirectory; string facePartsDirectory;
FileHolder? faceFileHolder; FileHolder? faceFileHolder;
@ -786,9 +799,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
throw new NotSupportedException(); throw new NotSupportedException();
if (question.MappingFromLocation is null) if (question.MappingFromLocation is null)
continue; continue;
(directory, ticks, personDirectory) = Get(_Configuration, _Configuration.SaveIndividually, by, question, padLeft); record = Get(_Configuration, _Configuration.SaveIndividually, by, question, padLeft);
if (string.IsNullOrEmpty(directory)) if (string.IsNullOrEmpty(record.Directory))
throw new NotSupportedException(); throw new NotSupportedException();
directory = record.Directory;
if (!string.IsNullOrEmpty(record.DebugDirectory))
results.Add(new(record.DebugDirectory));
if (question.MappingFromPerson is not null) if (question.MappingFromPerson is not null)
{ {
if (_Configuration.SaveIndividually) if (_Configuration.SaveIndividually)
@ -801,21 +817,21 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
{ {
if (!_Configuration.SaveSortingWithoutPerson) if (!_Configuration.SaveSortingWithoutPerson)
throw new NotSupportedException(); throw new NotSupportedException();
if (ticks is null) if (record.Ticks is null)
continue; continue;
if (_Configuration.SaveIndividually) if (_Configuration.SaveIndividually)
{ {
directory = Path.Combine(directory, question.MappingFromItem.Id.ToString()); 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) if (_Configuration.SaveIndividually && question.MappingFromLocation.WholePercentages == question.MappingFromLocation.WholePercentages)
results.Add(new(Path.Combine(directory, "Maybe"))); results.Add(new(Path.Combine(directory, "Maybe")));
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, question.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, question.MappingFromItem);
faceFileHolder = new(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); faceFileHolder = new(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, question.MappingFromItem); 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}"); 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}")); 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}")); 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)); throw new NotSupportedException(nameof(GetSortingCollection));
if (keyMapping.MappingFromFilterPost.CanReMap is not null && !keyMapping.MappingFromFilterPost.CanReMap.Value) if (keyMapping.MappingFromFilterPost.CanReMap is not null && !keyMapping.MappingFromFilterPost.CanReMap.Value)
throw new NotSupportedException(nameof(GetSortingCollection)); throw new NotSupportedException(nameof(GetSortingCollection));
if (!PreAndPostContinue(_Configuration, idToWholePercentagesToMapping, sorting, sortingContainer.Source, keyMapping)) if (!PreAndPostContinue(_Configuration, sortingContainer.Source, keyMapping))
continue; continue;
if (!idToWholePercentagesCollection.TryGetValue(sorting.Id, out wholePercentagesCollection)) if (!idToWholePercentagesCollection.TryGetValue(sorting.Id, out wholePercentagesCollection))
{ {

View File

@ -16,13 +16,13 @@ internal abstract class MapLogic
internal record Record(string PersonKeyFormatted, internal record Record(string PersonKeyFormatted,
int DirectoryNumber, int DirectoryNumber,
string PersonDisplayDirectoryName, string? PersonDisplayDirectoryName,
bool IsDefault, bool? IsDefault,
string MappedFaceFile); string MappedFaceFile);
internal record MappedFile(long PersonKey, internal record MappedFile(long PersonKey,
string PersonKeyFormatted, string PersonKeyFormatted,
string PersonDisplayDirectoryName, string? PersonDisplayDirectoryName,
int? DirectoryNumber, int? DirectoryNumber,
string File); string File);
@ -38,8 +38,8 @@ internal abstract class MapLogic
float? TotalDays); float? TotalDays);
internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted, internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
string PersonDisplayDirectoryName, string? PersonDisplayDirectoryName,
bool IsDefault, bool? IsDefault,
string MappedFaceFile, string MappedFaceFile,
int Id, int Id,
int WholePercentages); int WholePercentages);
@ -335,7 +335,7 @@ internal abstract class MapLogic
if (directoryInfo.LastWriteTime.Ticks != directoryTicks) if (directoryInfo.LastWriteTime.Ticks != directoryTicks)
Directory.SetLastWriteTime(ticksDirectory, new DateTime(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; 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) if (directoryDateTime.Hour == 0 && directoryDateTime.Minute == 0 && directoryDateTime.Second == 0)
continue; continue;
lastDirectoryTicks = directoryTicks; lastDirectoryTicks = directoryTicks;
@ -641,6 +641,7 @@ internal abstract class MapLogic
string[] fileMatches; string[] fileMatches;
const string lnk = ".lnk"; const string lnk = ".lnk";
int? id, wholePercentages; int? id, wholePercentages;
string personDisplayDirectoryName;
const bool fromDistanceContent = true; const bool fromDistanceContent = true;
IReadOnlyList<MetadataExtractor.Directory> directories; IReadOnlyList<MetadataExtractor.Directory> directories;
List<(string File, int WholePercentages)>? wholePercentagesCollection; List<(string File, int WholePercentages)>? wholePercentagesCollection;
@ -650,7 +651,7 @@ internal abstract class MapLogic
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File[..^4]); (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File[..^4]);
if (id is null || wholePercentages is null) if (id is null || wholePercentages is null)
return; 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(); fileMatches = (from l in wholePercentagesCollection where l.WholePercentages == wholePercentages select l.File).ToArray();
foreach (string fileMatch in fileMatches) foreach (string fileMatch in fileMatches)
@ -669,8 +670,9 @@ internal abstract class MapLogic
else else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.File); directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.File);
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName;
lock (locationContainers) 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<LocationContainer<MetadataExtractor.Directory>> locationContainers) private static void LookForPossibleDuplicates(Configuration configuration, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
@ -870,21 +872,46 @@ internal abstract class MapLogic
} }
} }
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection) private static List<Record> GetRecords(Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName)
{ {
List<Record> results = new(); List<Record> results = new();
int? id; 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<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
{
List<Record> results = new();
bool check; bool check;
bool isDefault;
string message; string message;
string[] files; string[] files;
string fileName; bool? isDefault;
int totalSeconds; int totalSeconds;
string checkFile;
DateTime dateTime; DateTime dateTime;
TimeSpan timeSpan; TimeSpan timeSpan;
int directoryNumber; int directoryNumber;
int? wholePercentages;
string? checkDirectory; string? checkDirectory;
ProgressBar progressBar; ProgressBar progressBar;
string[] yearDirectories; string[] yearDirectories;
@ -894,7 +921,7 @@ internal abstract class MapLogic
List<string> distinct = new(); List<string> distinct = new();
string[] personNameDirectories; string[] personNameDirectories;
string? newestPersonKeyFormatted; string? newestPersonKeyFormatted;
string personDisplayDirectoryName; string? personDisplayDirectoryName;
string[] personNameLinkDirectories; string[] personNameLinkDirectories;
string? personFirstInitialDirectory; string? personFirstInitialDirectory;
List<TicksDirectory> ticksDirectories; List<TicksDirectory> ticksDirectories;
@ -938,16 +965,32 @@ internal abstract class MapLogic
{ {
if (check && !Directory.Exists(yearDirectory)) if (check && !Directory.Exists(yearDirectory))
continue; 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); personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) if (personNameDirectories.Length > 1)
File.Delete(file); throw new NotSupportedException();
foreach (string personNameDirectory in personNameDirectories) foreach (string personNameDirectory in personNameDirectories)
{ {
directoryNumber++; directoryNumber++;
personDisplayDirectoryName = Path.GetFileName(personNameDirectory); personDisplayDirectoryName = Path.GetFileName(personNameDirectory);
isDefault = IPerson.IsDefaultName(personDisplayDirectoryName) && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]); 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)) if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
continue; continue;
@ -962,7 +1005,7 @@ internal abstract class MapLogic
check = true; check = true;
continue; 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); checkDirectory = Path.GetDirectoryName(ticksDirectory.Directory);
if (checkDirectory is null) 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!"); throw new Exception($"Move personKey directories up one from {manualCopyHumanized} and delete {manualCopyHumanized} directory!");
if (personKeyFormatted == forceSingleImageHumanized && files.Length > 0) if (personKeyFormatted == forceSingleImageHumanized && files.Length > 0)
throw new Exception($"Move personKey directories up one from {forceSingleImageHumanized} and delete {forceSingleImageHumanized} directory!"); 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) if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null)
RenameUnknown(files); RenameUnknown(files);
@ -1000,7 +1043,7 @@ internal abstract class MapLogic
} }
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length) if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length)
continue; continue;
if (personDisplayDirectoryName.Length == 1 || isDefault || !personKeyFormattedCollection.Contains(personKeyFormatted)) if (personDisplayDirectoryName.Length == 1 || isDefault.Value || !personKeyFormattedCollection.Contains(personKeyFormatted))
personFirstInitialDirectory = personNameDirectory; personFirstInitialDirectory = personNameDirectory;
else else
{ {
@ -1021,25 +1064,7 @@ internal abstract class MapLogic
Directory.Move(personNameDirectory, personFirstInitialDirectory); Directory.Move(personNameDirectory, personFirstInitialDirectory);
files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
} }
foreach (string mappedFaceFile in files) results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
{
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));
}
personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string personNameLinkDirectory in personNameLinkDirectories) foreach (string personNameLinkDirectory in personNameLinkDirectories)
{ {
@ -1083,6 +1108,7 @@ internal abstract class MapLogic
char status, sex, first; char status, sex, first;
PersonDirectory personDirectory; PersonDirectory personDirectory;
PersonContainer? personContainer; PersonContainer? personContainer;
string personDisplayDirectoryName;
foreach (PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages in personKeyFormattedIdThenWholePercentagesCollection) foreach (PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages in personKeyFormattedIdThenWholePercentagesCollection)
{ {
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormattedIdThenWholePercentages.PersonKeyFormatted); personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
@ -1090,13 +1116,14 @@ internal abstract class MapLogic
throw new Exception(); throw new Exception();
if (!personKeyFormattedToPersonContainer.TryGetValue(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, out personContainer)) 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) if (matches.Length == 0)
throw new NotSupportedException(); throw new NotSupportedException();
group = IPerson.GetHourGroup(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour); group = IPerson.GetHourGroup(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour);
(status, sex, first) = IPerson.GetPersonHour(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour); (status, sex, first) = IPerson.GetPersonHour(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour);
personDirectory = new(matches.First(), group, status, sex, first); 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); personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer);
} }
if (personContainer.Key is null) if (personContainer.Key is null)
@ -1280,8 +1307,11 @@ internal abstract class MapLogic
ParallelFor(configuration, skipCollection, results, mappedFiles[i]); ParallelFor(configuration, skipCollection, results, mappedFiles[i]);
}); });
} }
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray()); if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
LookForPossibleDuplicates(configuration, locationContainers); {
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray());
LookForPossibleDuplicates(configuration, locationContainers);
}
return results; return results;
} }
@ -1785,6 +1815,39 @@ internal abstract class MapLogic
return result; return result;
} }
private static void AddDisplayDirectoryNames(Configuration configuration, string eDistanceContentDirectory, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyCollection<ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>> collections)
{
bool isCounterPersonYear;
string personKeyFormatted;
string? displayDirectoryName;
string? checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory);
_ = IPath.DeleteEmptyDirectories(checkDirectory);
foreach (ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> 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<MetadataExtractor.Directory> distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection) internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance<MetadataExtractor.Directory> distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection)
{ {
bool isCounterPersonYear; bool isCounterPersonYear;
@ -1802,11 +1865,13 @@ internal abstract class MapLogic
progressBar.Tick(); progressBar.Tick();
if (collection.Count == 0) if (collection.Count == 0)
continue; continue;
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year); 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); 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<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation) internal static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)

View File

@ -5,6 +5,6 @@ namespace View_by_Distance.Shared.Models.Methods;
public interface IDistance<T> public interface IDistance<T>
{ {
void SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<T>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName); void SaveMappedForOutputResolutions(string locationContainerDebugDirectory, string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<T>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName);
} }

View File

@ -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 == 0 ? new('U', 'U', 'U') :
hour == 1 ? new('U', 'U', 'U') : hour == 1 ? new('U', 'U', 'U') :
hour == 2 ? new('U', 'U', 'U') : hour == 2 ? new('U', 'U', 'U') :
@ -21,7 +21,7 @@ public interface IPerson
hour == 17 ? new('D', 'M', 'N') : hour == 17 ? new('D', 'M', 'N') :
throw new NotImplementedException(personDisplayDirectoryName); throw new NotImplementedException(personDisplayDirectoryName);
static string GetHourGroup(string personDisplayDirectoryName, int hour) => static string GetHourGroup(string? personDisplayDirectoryName, int hour) =>
hour == 0 ? "Unknown-Unknown-Unknown" : hour == 0 ? "Unknown-Unknown-Unknown" :
hour == 1 ? "Unknown-Unknown-Unknown" : hour == 1 ? "Unknown-Unknown-Unknown" :
hour == 2 ? "Unknown-Unknown-Unknown" : hour == 2 ? "Unknown-Unknown-Unknown" :

View File

@ -83,7 +83,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodDel() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
for (int i = 1; i < 11; i++) for (int i = 1; i < 11; i++)
@ -96,7 +96,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodGetApproximateYears() 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)) if (Directory.Exists(Directory.GetDirectoryRoot(personDisplayDirectory)) && Directory.Exists(personDisplayDirectory))
{ {
char numberSign = '#'; char numberSign = '#';
@ -120,7 +120,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodDel2() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
for (int i = 1; i < 11; i++) for (int i = 1; i < 11; i++)
@ -199,7 +199,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameAbandoned() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -219,7 +219,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameDelete() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -239,7 +239,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameOld() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -256,6 +256,41 @@ public partial class UnitTestHardCoded
NonThrowTryCatch(); 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] [TestMethod]
public void TestMethodRename() public void TestMethodRename()
{ {
@ -278,7 +313,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameForUnkown() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string[] files = Directory.GetFiles(directory, "*.unk", SearchOption.AllDirectories); string[] files = Directory.GetFiles(directory, "*.unk", SearchOption.AllDirectories);
@ -291,7 +326,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameForTicks() 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)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkName; string checkName;