GetToDoCollection

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

View File

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