This commit is contained in:
2022-11-20 23:20:28 -07:00
parent c6aa7e8e3c
commit 3b988ba152
85 changed files with 1355 additions and 980 deletions

View File

@ -37,15 +37,11 @@ public class DateGroup
_FilePropertiesKeyValuePairs = new Dictionary<string, List<Tuple<string, Shared.Models.Property>>>();
Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: true);
Models.Configuration configuration = Models.Stateless.Configuration.Get(isEnvironment, configurationRoot, workingDirectory, propertyConfiguration);
Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
Verify(configuration);
bool reverse = false;
_Configuration = configuration;
string outputExtension = ".jpg";
if (configuration.ByHash is null)
throw new NullReferenceException(nameof(configuration.ByHash));
if (configuration.ByCreateDateShortcut is null)
throw new NullReferenceException(nameof(configuration.ByCreateDateShortcut));
if (!_IsEnvironment.Development)
throw new Exception("This program only allows development environments!");
long ticks = DateTime.Now.Ticks;
@ -59,10 +55,70 @@ public class DateGroup
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory);
if (true || appSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories));
string destinationRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(propertyConfiguration, "Z) Moved");
// string[] moveBackFileNames = Directory.GetFiles(destinationRoot, "*", SearchOption.AllDirectories);
// if (moveBackFileNames is not null)
// {
// string checkFile;
// string? directory;
// bool check = false;
// string directoryName;
// string checkDirectory;
// string moveBackFileNameWithExtension;
// foreach (string moveBackFileName in moveBackFileNames)
// {
// moveBackFileNameWithExtension = Path.GetFileName(moveBackFileName);
// foreach ((int g, string sourceDirectory, string[] sourceDirectoryFiles) in jsonCollection)
// {
// foreach (string sourceDirectoryFile in sourceDirectoryFiles)
// {
// check = false;
// if (!sourceDirectoryFile.Contains(moveBackFileNameWithExtension))
// continue;
// directory = Path.GetDirectoryName(sourceDirectoryFile);
// if (directory is null)
// continue;
// directoryName = Path.GetFileName(directory);
// checkDirectory = Path.Combine(configuration.RootDirectory, directoryName);
// if (!Directory.Exists(checkDirectory))
// continue;
// checkFile = Path.Combine(checkDirectory, moveBackFileNameWithExtension);
// if (File.Exists(checkFile))
// continue;
// File.Move(moveBackFileName, checkFile);
// check = true;
// break;
// }
// if (check)
// break;
// }
// if (!check)
// continue;
// }
// // string destinationRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(propertyConfiguration, "Z) Moved");
// // for (int i = 1; i < 10; i++)
// // _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(destinationRoot);
// }
// string[] moveBackFileNames = Directory.GetFiles(aPropertySingletonDirectory, "*.jpg", SearchOption.AllDirectories);
// foreach (string moveBackFileName in moveBackFileNames)
// {
// string? directory = Path.GetDirectoryName(moveBackFileName);
// if (directory is null)
// continue;
// string directoryName = Path.GetFileName(directory);
// string moveBackFileNameWithExtension = Path.GetFileName(moveBackFileName);
// string checkDirectory = Path.Combine(configuration.RootDirectory, directoryName);
// if (!Directory.Exists(checkDirectory))
// continue;
// string checkFile = Path.Combine(checkDirectory, moveBackFileNameWithExtension);
// if (File.Exists(checkFile))
// continue;
// File.Move(moveBackFileName, checkFile);
// }
(int j, int f, int t, Container[] containers) = Property.Models.Stateless.Container.GetContainers(propertyConfiguration, propertyLogic);
if (propertyLogic.ExceptionsDirectories.Any())
throw new Exception();
if (propertyConfiguration.PopulatePropertyId && (configuration.ByCreateDateShortcut.Value || configuration.ByHash.Value) && Shared.Models.Stateless.Methods.IProperty.Any(containers))
if (propertyConfiguration.PopulatePropertyId && (configuration.ByCreateDateShortcut || configuration.ByHash) && Shared.Models.Stateless.Methods.IProperty.Any(containers))
{
propertyLogic.SavePropertyParallelWork(ticks, containers);
if (appSettings.MaxDegreeOfParallelism < 2)
@ -70,35 +126,34 @@ public class DateGroup
if (propertyLogic.ExceptionsDirectories.Any())
throw new Exception();
}
if (configuration.ByCreateDateShortcut.HasValue && configuration.ByCreateDateShortcut.Value)
if (configuration.ByCreateDateShortcut)
CreateDateShortcut(propertyConfiguration, containers);
else
MoveFiles(propertyConfiguration, containers);
MoveFiles(propertyConfiguration, destinationRoot, containers);
}
private static void Verify(Models.Configuration configuration)
{
if (configuration.ByCreateDateShortcut is null)
throw new NullReferenceException(nameof(configuration.ByCreateDateShortcut));
if (configuration.ByDay is null)
throw new NullReferenceException(nameof(configuration.ByDay));
if (configuration.ByHash is null)
throw new NullReferenceException(nameof(configuration.ByHash));
if (configuration.BySeason is null)
throw new NullReferenceException(nameof(configuration.BySeason));
if (configuration.ByWeek is null)
throw new NullReferenceException(nameof(configuration.ByWeek));
if (!configuration.ByCreateDateShortcut.Value && !configuration.ByDay.Value && !configuration.ByWeek.Value && !configuration.BySeason.Value && !configuration.ByHash.Value)
int check = 0;
if (configuration.ByCreateDateShortcut)
check += 1;
if (configuration.ByDay)
check += 1;
if (configuration.ByHash)
check += 1;
if (configuration.ByNone)
check += 1;
if (configuration.BySeason)
check += 1;
if (configuration.ByWeek)
check += 1;
if (check != 1)
throw new Exception("Change configuration!");
if (configuration.KeepFullPath is null)
throw new NullReferenceException(nameof(configuration.KeepFullPath));
if (configuration?.PropertyConfiguration?.PopulatePropertyId is null)
throw new NullReferenceException(nameof(configuration.PropertyConfiguration.PopulatePropertyId));
if (configuration.PropertyConfiguration.PopulatePropertyId && !configuration.ByCreateDateShortcut.Value && !configuration.ByHash.Value)
if (configuration.PropertyConfiguration.PopulatePropertyId && !configuration.ByCreateDateShortcut && !configuration.ByHash)
throw new Exception("Change configuration!");
if (!configuration.PropertyConfiguration.PopulatePropertyId && configuration.ByHash.Value)
throw new Exception("Change configuration!");
if (configuration.ByCreateDateShortcut.Value && configuration.ByDay.Value && configuration.ByWeek.Value && configuration.BySeason.Value && configuration.ByHash.Value)
if (!configuration.PropertyConfiguration.PopulatePropertyId && configuration.ByHash)
throw new Exception("Change configuration!");
}
@ -148,18 +203,6 @@ public class DateGroup
private List<(Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)> GetMoveFileCollection(string destinationDirectory, string topDirectory, Item[] filteredItems)
{
List<(Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)> results = new();
if (_Configuration.ByCreateDateShortcut is null)
throw new NullReferenceException(nameof(_Configuration.ByCreateDateShortcut));
if (_Configuration.ByDay is null)
throw new NullReferenceException(nameof(_Configuration.ByDay));
if (_Configuration.ByHash is null)
throw new NullReferenceException(nameof(_Configuration.ByHash));
if (_Configuration.BySeason is null)
throw new NullReferenceException(nameof(_Configuration.BySeason));
if (_Configuration.ByWeek is null)
throw new NullReferenceException(nameof(_Configuration.ByWeek));
if (_Configuration.KeepFullPath is null)
throw new NullReferenceException(nameof(_Configuration.KeepFullPath));
char flag;
string day;
int season;
@ -213,11 +256,10 @@ public class DateGroup
if (matches is not null && matches.Any())
break;
}
if (matches is null)
matches = Array.Empty<string>();
matches ??= Array.Empty<string>();
foreach (Item item in filteredItems)
{
if (item.ImageFileHolder is null || item.Property is null || (_Configuration.PropertyConfiguration.PopulatePropertyId && item.Property.Id is null))
if (item.Property is null || (_Configuration.PropertyConfiguration.PopulatePropertyId && item.Property.Id is null))
continue;
directoryNames.Clear();
destinationCollection = new();
@ -261,20 +303,23 @@ public class DateGroup
}
topDirectoryName = Path.GetFileName(topDirectory);
weekOfYear = calendar.GetWeekOfYear(minimumDateTime.Value, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
if (_Configuration.ByHash.Value)
if (_Configuration.ByNone)
directoryNames.Clear();
else if (_Configuration.ByHash)
directoryNames.Add($"{year} {seasonName}");
else if (_Configuration.BySeason.Value && topDirectoryName.Length == 1 && topDirectoryName[0] == '_')
else if (_Configuration.BySeason && topDirectoryName.Length == 1 && topDirectoryName[0] == '_')
directoryNames.Add($"{year} {seasonName}");
else
{
if (!_Configuration.KeepFullPath.Value)
if (!_Configuration.KeepFullPath)
{
_ = destinationDirectoryName.Append(topDirectoryName);
if (_Configuration.BySeason.Value)
if (topDirectoryName.Length > 1)
_ = destinationDirectoryName.Append(topDirectoryName);
if (_Configuration.BySeason)
directoryNames.AddRange(new string[] { $"{destinationDirectoryName} {year} {seasonName}" });
else if (_Configuration.ByDay.Value)
else if (_Configuration.ByDay)
directoryNames.AddRange(new string[] { $"{destinationDirectoryName} {year}", $"{weekOfYear}) {year}-{day}" });
else if (_Configuration.ByWeek.Value)
else if (_Configuration.ByWeek)
directoryNames.AddRange(new string[] { $"{destinationDirectoryName} {year}", $"{weekOfYear}) {year} {month}" });
else
throw new Exception();
@ -288,17 +333,17 @@ public class DateGroup
else
_ = destinationDirectoryName.Append(sourceDirectoryNameSegment);
}
if (_Configuration.BySeason.Value)
if (_Configuration.BySeason)
directoryNames.Add($"{year} {seasonName}");
else if (_Configuration.ByDay.Value)
else if (_Configuration.ByDay)
directoryNames.Add($"{weekOfYear}) {year} {day}");
else if (_Configuration.ByWeek.Value)
else if (_Configuration.ByWeek)
directoryNames.Add($"{weekOfYear}) {month} {year}");
else
throw new Exception();
}
}
if (!_Configuration.ByHash.Value || item.Property.Id is null)
if (!_Configuration.ByHash || item.Property.Id is null)
fileName = item.ImageFileHolder.Name;
else
fileName = $"{item.Property.Id.Value}{item.ImageFileHolder.ExtensionLowered}";
@ -325,18 +370,15 @@ public class DateGroup
foreach (Item item in container.Items)
{
if (item.ImageFileHolder is not null
&& (item.Abandoned is null || !item.Abandoned.Value)
&& item.ValidImageFormatExtension)
&& (item.Abandoned is null || !item.Abandoned.Value))
results.Add(item);
}
return results.ToArray();
}
private (Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)[] GetFileMoveCollectionAll(Property.Models.Configuration configuration, Container[] containers, string destinationRoot)
private (Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)[] GetFileMoveCollectionAll(Property.Models.Configuration configuration, string destinationRoot, Container[] containers)
{
(Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)[] results;
if (_Configuration.KeepFullPath is null)
throw new NullReferenceException(nameof(_Configuration.KeepFullPath));
string? topDirectory;
string? checkDirectory;
string destinationDirectory;
@ -347,7 +389,7 @@ public class DateGroup
{
if (!container.Items.Any())
continue;
if (!_Configuration.KeepFullPath.Value)
if (!_Configuration.KeepFullPath)
destinationDirectory = destinationRoot;
else
destinationDirectory = string.Concat(destinationRoot, container.SourceDirectory[configuration.RootDirectory.Length..]);
@ -373,12 +415,10 @@ public class DateGroup
return results;
}
private void MoveFiles(Property.Models.Configuration configuration, Container[] containers)
private void MoveFiles(Property.Models.Configuration configuration, string destinationRoot, Container[] containers)
{
if (_Log is null)
throw new NullReferenceException(nameof(_Log));
if (_Configuration.ByHash is null)
throw new NullReferenceException(nameof(_Configuration.ByHash));
bool hasDuplicate;
string fullFileName;
string directoryName;
@ -387,12 +427,9 @@ public class DateGroup
List<string> filesDistinct = new();
List<string> filesDuplicate = new();
List<string> directoriesDistinct = new();
string destinationRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(configuration, "Z) Moved");
(Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)[] fileMoveCollectionAll = GetFileMoveCollectionAll(configuration, containers, destinationRoot);
(Item Item, long LastWriteTimeTicks, long MinimumDateTimeTicks, string[] Destination)[] fileMoveCollectionAll = GetFileMoveCollectionAll(configuration, destinationRoot, containers);
foreach ((Item item, long lastWriteTimeTicks, long minimumDateTimeTicks, string[] destination) in fileMoveCollectionAll)
{
if (item.ImageFileHolder is null)
continue;
fullFileName = Path.Combine(destination);
if (filesDistinct.Contains(fullFileName))
filesDuplicate.Add(fullFileName);
@ -403,13 +440,10 @@ public class DateGroup
directoriesDistinct.Add(directoryName);
if (!Directory.Exists(directoryName))
_ = Directory.CreateDirectory(directoryName);
if (_Configuration.ByHash.Value)
{
if (!Directory.Exists(string.Concat(directoryName, duplicate, " I")))
_ = Directory.CreateDirectory(string.Concat(directoryName, duplicate, " I"));
if (!Directory.Exists(string.Concat(directoryName, duplicate, " II")))
_ = Directory.CreateDirectory(string.Concat(directoryName, duplicate, " II"));
}
if (!Directory.Exists(string.Concat(directoryName, duplicate, " I")))
_ = Directory.CreateDirectory(string.Concat(directoryName, duplicate, " I"));
if (!Directory.Exists(string.Concat(directoryName, duplicate, " II")))
_ = Directory.CreateDirectory(string.Concat(directoryName, duplicate, " II"));
}
_Log.Information("Ready to move files?");
for (int y = 0; y < int.MaxValue; y++)
@ -422,8 +456,6 @@ public class DateGroup
int moved = 0;
foreach ((Item item, long lastWriteTimeTicks, long minimumDateTimeTicks, string[] destination) in fileMoveCollectionAll)
{
if (item.ImageFileHolder is null)
continue;
fullFileName = Path.Combine(destination);
hasDuplicate = filesDuplicate.Contains(fullFileName);
if (hasDuplicate)
@ -431,10 +463,10 @@ public class DateGroup
destination[1] = string.Concat(destination[1], duplicate, " I");
fullFileName = Path.Combine(destination);
}
if (File.Exists(fullFileName))
for (int i = 0; i < 256 - destination[1].Length; i++)
{
if (!_Configuration.ByHash.Value)
continue;
if (!File.Exists(fullFileName))
break;
else
{
destination[1] = string.Concat(destination[1], "I");
@ -456,8 +488,7 @@ public class DateGroup
catch (Exception) { }
}
}
if (_Configuration.ByHash.Value)
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(destinationRoot);
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(destinationRoot);
_Log.Information($"{moved} file(s) moved");
for (int y = 0; y < int.MaxValue; y++)
{
@ -468,8 +499,6 @@ public class DateGroup
_Log.Information(". . .");
foreach ((Item item, long lastWriteTimeTicks, long minimumDateTimeTicks, string[] destination) in fileMoveCollectionAll)
{
if (item.ImageFileHolder is null)
continue;
fullFileName = Path.Combine(destination);
if (File.Exists(item.ImageFileHolder.FullName))
continue;