FilePath ready to test
This commit is contained in:
@ -5,8 +5,6 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
internal abstract partial class XDirectory
|
||||
{
|
||||
|
||||
private record SortedRecord(Models.FileHolder FileHolder, bool NameWithoutExtensionIsIdFormat, int? Id);
|
||||
|
||||
private static int GetCeilingAverage(List<string[]> fileCollection)
|
||||
{
|
||||
List<int> counts = [];
|
||||
@ -39,6 +37,8 @@ internal abstract partial class XDirectory
|
||||
fileSearchFilter = string.Concat('*', fileSearchFilter);
|
||||
if (!directorySearchFilter.Contains('*'))
|
||||
directorySearchFilter = string.Concat('*', directorySearchFilter);
|
||||
if (!Directory.Exists(directory))
|
||||
_ = Directory.CreateDirectory(directory);
|
||||
results.Add(Directory.GetFiles(directory, fileSearchFilter, SearchOption.TopDirectoryOnly));
|
||||
string[] directories = Directory.GetDirectories(directory, directorySearchFilter, SearchOption.TopDirectoryOnly);
|
||||
foreach (string innerDirectory in directories)
|
||||
@ -185,46 +185,28 @@ internal abstract partial class XDirectory
|
||||
return results;
|
||||
}
|
||||
|
||||
private static void IsUniqueLoop(string resultAllInOne, string resultAllInOneDirectory, int resultAllInOneSubdirectoryLength, FilePair item, List<(string, string)> rename)
|
||||
private static void IsNotUniqueLoop(Properties.IPropertyConfiguration propertyConfiguration, string jsonGroupDirectory, string extension, FilePair filePair, List<(string, string)> rename)
|
||||
{
|
||||
string fileName;
|
||||
string directoryName;
|
||||
foreach (string path in item.Collection)
|
||||
int length = propertyConfiguration.RootDirectory.Length;
|
||||
foreach (string path in filePair.Collection)
|
||||
{
|
||||
if (path.Contains(resultAllInOne))
|
||||
if (filePair.Match is null || path != filePair.Match)
|
||||
continue;
|
||||
fileName = Path.GetFileName(path);
|
||||
(directoryName, _) = IPath.GetDirectoryNameAndIndex(resultAllInOneSubdirectoryLength, fileName);
|
||||
rename.Add(new(path, Path.Combine(resultAllInOneDirectory, directoryName, fileName)));
|
||||
rename.Add(new(path, string.Concat(jsonGroupDirectory, filePair.Path[length..], extension)));
|
||||
}
|
||||
}
|
||||
|
||||
private static void IsNotUniqueLoop(string directory, string resultAllInOne, string jsonGroupDirectory, string extension, FilePair item, List<(string, string)> rename)
|
||||
{
|
||||
int length = directory.Length;
|
||||
foreach (string path in item.Collection)
|
||||
{
|
||||
if (!path.Contains(resultAllInOne))
|
||||
continue;
|
||||
if (item.Match is null || path != item.Match)
|
||||
continue;
|
||||
rename.Add(new(path, string.Concat(jsonGroupDirectory, item.Path[length..], extension)));
|
||||
}
|
||||
}
|
||||
|
||||
internal static int MaybeMove(string directory, string resultAllInOne, int resultAllInOneSubdirectoryLength, List<FilePair> filePairs, string jsonGroupDirectory, string extension)
|
||||
internal static int MaybeMove(Properties.IPropertyConfiguration propertyConfiguration, List<FilePair> filePairs, string jsonGroupDirectory, string extension)
|
||||
{
|
||||
FileInfo? toFileInfo;
|
||||
FileInfo fromFileInfo;
|
||||
string checkDirectory;
|
||||
List<(string, string)> rename = [];
|
||||
string resultAllInOneDirectory = Path.Combine(jsonGroupDirectory, resultAllInOne);
|
||||
foreach (FilePair item in filePairs)
|
||||
foreach (FilePair filePair in filePairs)
|
||||
{
|
||||
if (item.IsUnique)
|
||||
IsUniqueLoop(resultAllInOne, resultAllInOneDirectory, resultAllInOneSubdirectoryLength, item, rename);
|
||||
else
|
||||
IsNotUniqueLoop(directory, resultAllInOne, jsonGroupDirectory, extension, item, rename);
|
||||
if (filePair.IsUnique)
|
||||
continue;
|
||||
IsNotUniqueLoop(propertyConfiguration, jsonGroupDirectory, extension, filePair, rename);
|
||||
}
|
||||
foreach ((string from, string to) in rename)
|
||||
{
|
||||
@ -283,153 +265,109 @@ internal abstract partial class XDirectory
|
||||
}
|
||||
}
|
||||
|
||||
internal static (bool, int?) GetId(short sortOrderOnlyLengthIndex, Models.FileHolder fileHolder)
|
||||
private static FilePath[] GetSortedRecords(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection)
|
||||
{
|
||||
int? id;
|
||||
short? multiplier;
|
||||
char negativeMarker;
|
||||
int absoluteValueOfId;
|
||||
bool nameWithoutExtensionIsIdFormat = IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
|
||||
bool nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileHolder, sortOrderOnlyLengthIndex);
|
||||
if (!nameWithoutExtensionIsIdFormat && !nameWithoutExtensionIsPaddedIdFormat)
|
||||
id = null;
|
||||
else if (nameWithoutExtensionIsIdFormat)
|
||||
{
|
||||
if (!int.TryParse(fileHolder.NameWithoutExtension, out absoluteValueOfId))
|
||||
id = null;
|
||||
else
|
||||
id = absoluteValueOfId;
|
||||
}
|
||||
else
|
||||
{
|
||||
negativeMarker = fileHolder.NameWithoutExtension[sortOrderOnlyLengthIndex - 2];
|
||||
if (negativeMarker == '7')
|
||||
multiplier = 1;
|
||||
else if (negativeMarker == '3')
|
||||
multiplier = -1;
|
||||
else
|
||||
multiplier = null;
|
||||
if (!int.TryParse(fileHolder.NameWithoutExtension[sortOrderOnlyLengthIndex..], out absoluteValueOfId))
|
||||
id = null;
|
||||
else
|
||||
{
|
||||
id = absoluteValueOfId * multiplier;
|
||||
if (id is null || !fileHolder.NameWithoutExtension.EndsWith(id.Value.ToString()[1..]))
|
||||
id = null;
|
||||
}
|
||||
}
|
||||
return (nameWithoutExtensionIsIdFormat, id);
|
||||
}
|
||||
|
||||
private static SortedRecord[] GetSortedRecords(int offset, ReadOnlyCollection<string[]> filesCollection)
|
||||
{
|
||||
List<SortedRecord> results = [];
|
||||
int? id;
|
||||
List<FilePath> results = [];
|
||||
FilePath filePath;
|
||||
Models.FileHolder fileHolder;
|
||||
bool nameWithoutExtensionIsIdFormat;
|
||||
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(offset);
|
||||
foreach (string[] files in filesCollection)
|
||||
{
|
||||
foreach (string file in files)
|
||||
{
|
||||
fileHolder = new(file);
|
||||
(nameWithoutExtensionIsIdFormat, id) = GetId(sortOrderOnlyLengthIndex, fileHolder);
|
||||
results.Add(new(fileHolder, nameWithoutExtensionIsIdFormat, id));
|
||||
fileHolder = IFileHolder.Get(file);
|
||||
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
|
||||
results.Add(filePath);
|
||||
}
|
||||
}
|
||||
return (from l in results orderby l.FileHolder.CreationTime, l.FileHolder.FullName.Length descending select l).ToArray();
|
||||
return (from l in results orderby l.CreationTicks, l.FullName.Length descending select l).ToArray();
|
||||
}
|
||||
|
||||
internal static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick)
|
||||
internal static (string[], List<(FilePath, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick)
|
||||
{
|
||||
List<(Models.FileHolder, string?, string)> results = [];
|
||||
List<(FilePath, string)> results = [];
|
||||
string paddedId;
|
||||
string checkFile;
|
||||
string directory;
|
||||
FileInfo fileInfo;
|
||||
FilePath filePath;
|
||||
int directoryIndex;
|
||||
bool ignore = false;
|
||||
string paddedIdFile;
|
||||
bool wrapped = false;
|
||||
string directoryName;
|
||||
string intelligentId;
|
||||
bool paddedCheck = false;
|
||||
string fileDirectoryName;
|
||||
SortedRecord sortedRecord;
|
||||
string? alternateCheckFile;
|
||||
string? alternateDirectory;
|
||||
Models.FileHolder fileHolder;
|
||||
List<int> distinctIds = [];
|
||||
List<string> distinct = [];
|
||||
Models.FileHolder fileHolder;
|
||||
List<string> distinctDirectories = [];
|
||||
int intMinValueLength = int.MinValue.ToString().Length;
|
||||
SortedRecord[] sortedRecords = GetSortedRecords(propertyConfiguration.Offset, filesCollection);
|
||||
string? alternateResultAllInOne = !propertyConfiguration.ResultAllInOne.Contains(' ') ? null : propertyConfiguration.ResultAllInOne.Replace(' ', '-');
|
||||
FilePath[] sortedRecords = GetSortedRecords(propertyConfiguration, filesCollection);
|
||||
for (int i = 0; i < sortedRecords.Length; i++)
|
||||
{
|
||||
tick?.Invoke();
|
||||
sortedRecord = sortedRecords[i];
|
||||
fileHolder = sortedRecord.FileHolder;
|
||||
if (fileHolder.Name.EndsWith("len") || fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
|
||||
filePath = sortedRecords[i];
|
||||
if (filePath.Name.EndsWith("len") || filePath.ExtensionLowered == ".id" || filePath.ExtensionLowered == ".lsv" || filePath.DirectoryName is null)
|
||||
continue;
|
||||
(directoryName, directoryIndex) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.NameWithoutExtension);
|
||||
fileDirectoryName = Path.GetFileName(fileHolder.DirectoryName);
|
||||
if (fileDirectoryName.Length < propertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !fileHolder.Name.StartsWith(fileDirectoryName))
|
||||
(_, directoryIndex) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
|
||||
fileDirectoryName = Path.GetFileName(filePath.DirectoryName);
|
||||
if (fileDirectoryName.Length < propertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !filePath.Name.StartsWith(fileDirectoryName))
|
||||
{
|
||||
if (wrapped)
|
||||
continue;
|
||||
directory = directories[directoryIndex];
|
||||
if (alternateResultAllInOne is null)
|
||||
alternateDirectory = null;
|
||||
else
|
||||
alternateDirectory = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(directory)) ?? directory, alternateResultAllInOne, directoryName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!wrapped)
|
||||
wrapped = true;
|
||||
alternateDirectory = null;
|
||||
directory = Path.Combine(directories[directoryIndex], fileDirectoryName);
|
||||
}
|
||||
if (ifCanUseId && sortedRecord.NameWithoutExtensionIsIdFormat && sortedRecord.Id is not null && fileHolder.DirectoryName is not null)
|
||||
if (ifCanUseId && filePath.IsIntelligentIdFormat && filePath.Id is not null && filePath.DirectoryName is not null)
|
||||
{
|
||||
paddedId = IDirectory.GetPaddedId(intMinValueLength, propertyConfiguration.Offset + i, sortedRecord.Id.Value);
|
||||
paddedIdFile = Path.Combine(fileHolder.DirectoryName, $"{paddedId}{fileHolder.ExtensionLowered}");
|
||||
paddedId = IId.GetPaddedId(propertyConfiguration, i, filePath.Id.Value);
|
||||
paddedIdFile = Path.Combine(filePath.DirectoryName, $"{paddedId}{filePath.ExtensionLowered}");
|
||||
if (!File.Exists(paddedIdFile))
|
||||
{
|
||||
File.Move(fileHolder.FullName, paddedIdFile);
|
||||
fileHolder = new(paddedIdFile);
|
||||
File.Move(filePath.FullName, paddedIdFile);
|
||||
fileInfo = new(paddedIdFile);
|
||||
fileHolder = Models.FileHolder.Get(fileInfo);
|
||||
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
|
||||
if (!paddedCheck)
|
||||
paddedCheck = true;
|
||||
}
|
||||
}
|
||||
if (ifCanUseId)
|
||||
checkFile = Path.Combine(directory, $"{sortedRecord.Id}{fileHolder.ExtensionLowered}");
|
||||
if (filePath.IsIntelligentIdFormat || !ifCanUseId)
|
||||
checkFile = Path.Combine(directory, $"{filePath.NameWithoutExtension}{filePath.ExtensionLowered}");
|
||||
else
|
||||
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}{fileHolder.ExtensionLowered}");
|
||||
if ((sortedRecord.Id is not null && distinctIds.Contains(sortedRecord.Id.Value)) || distinct.Contains(checkFile))
|
||||
{
|
||||
if (string.IsNullOrEmpty(fileHolder.DirectoryName))
|
||||
if (filePath.Id is null)
|
||||
throw new NullReferenceException(nameof(filePath.Id));
|
||||
intelligentId = IId.GetIntelligentId(propertyConfiguration, filePath.Id.Value, ignore);
|
||||
checkFile = Path.Combine(directory, $"{intelligentId}{filePath.ExtensionLowered}");
|
||||
}
|
||||
if ((filePath.Id is not null && distinctIds.Contains(filePath.Id.Value)) || distinct.Contains(checkFile))
|
||||
{
|
||||
if (string.IsNullOrEmpty(filePath.DirectoryName))
|
||||
continue;
|
||||
if (!copyDuplicates)
|
||||
continue;
|
||||
alternateDirectory = null;
|
||||
for (int j = 1; j < int.MaxValue; j++)
|
||||
{
|
||||
fileInfo = new(checkFile);
|
||||
if (!fileInfo.Exists || fileHolder.Length == fileInfo.Length && fileHolder.LastWriteTime == fileInfo.LastWriteTime)
|
||||
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{j}dup{fileHolder.ExtensionLowered}");
|
||||
if (!fileInfo.Exists || filePath.Length == fileInfo.Length && filePath.LastWriteTicks == fileInfo.LastWriteTime.Ticks)
|
||||
checkFile = Path.Combine(directory, $"{filePath.NameWithoutExtension}.{j}dup{filePath.ExtensionLowered}");
|
||||
else
|
||||
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{j}why{fileHolder.ExtensionLowered}");
|
||||
if (sortedRecord.Id is not null)
|
||||
checkFile = Path.Combine(directory, $"{filePath.NameWithoutExtension}.{j}why{filePath.ExtensionLowered}");
|
||||
if (filePath.Id is not null)
|
||||
{
|
||||
if (distinctIds.Contains(sortedRecord.Id.Value))
|
||||
if (distinctIds.Contains(filePath.Id.Value))
|
||||
continue;
|
||||
distinctIds.Add(sortedRecord.Id.Value);
|
||||
distinctIds.Add(filePath.Id.Value);
|
||||
}
|
||||
if (distinct.Contains(checkFile))
|
||||
continue;
|
||||
alternateCheckFile = null;
|
||||
distinct.Add(checkFile);
|
||||
results.Add(new(fileHolder, alternateCheckFile, checkFile));
|
||||
results.Add(new(filePath, checkFile));
|
||||
if (!distinctDirectories.Contains(directory))
|
||||
distinctDirectories.Add(directory);
|
||||
break;
|
||||
@ -437,17 +375,9 @@ internal abstract partial class XDirectory
|
||||
continue;
|
||||
}
|
||||
distinct.Add(checkFile);
|
||||
if (sortedRecord.Id is not null)
|
||||
distinctIds.Add(sortedRecord.Id.Value);
|
||||
if (string.IsNullOrEmpty(alternateDirectory))
|
||||
alternateCheckFile = null;
|
||||
else
|
||||
{
|
||||
alternateCheckFile = Path.Combine(alternateDirectory, $"{sortedRecord.Id}{fileHolder.ExtensionLowered}.tsv");
|
||||
if (!distinctDirectories.Contains(alternateDirectory))
|
||||
distinctDirectories.Add(alternateDirectory);
|
||||
}
|
||||
results.Add(new(fileHolder, alternateCheckFile, checkFile));
|
||||
if (filePath.Id is not null)
|
||||
distinctIds.Add(filePath.Id.Value);
|
||||
results.Add(new(filePath, checkFile));
|
||||
if (!distinctDirectories.Contains(directory))
|
||||
distinctDirectories.Add(directory);
|
||||
}
|
||||
@ -456,30 +386,28 @@ internal abstract partial class XDirectory
|
||||
return (distinctDirectories.ToArray(), results);
|
||||
}
|
||||
|
||||
internal static List<string> CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick)
|
||||
internal static List<string> CopyOrMove(List<(FilePath, string)> toDoCollection, bool move, bool moveBack, Action? tick)
|
||||
{
|
||||
List<string> results = [];
|
||||
FileInfo fileInfo;
|
||||
foreach ((Models.FileHolder fileHolder, string? alternateFile, string to) in toDoCollection)
|
||||
foreach ((FilePath filePath, string to) in toDoCollection)
|
||||
{
|
||||
tick?.Invoke();
|
||||
fileInfo = new(to);
|
||||
if (!fileInfo.Exists && alternateFile is not null)
|
||||
_ = XPath.WriteAllText(alternateFile, fileHolder.FullName, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
if (fileInfo.Exists)
|
||||
{
|
||||
if (fileHolder.Length != fileInfo.Length || fileHolder.LastWriteTime != fileInfo.LastWriteTime)
|
||||
if (filePath.Length != fileInfo.Length || filePath.LastWriteTicks != fileInfo.LastWriteTime.Ticks)
|
||||
fileInfo.Delete();
|
||||
else
|
||||
continue;
|
||||
}
|
||||
results.Add(fileHolder.NameWithoutExtension);
|
||||
results.Add(filePath.NameWithoutExtension);
|
||||
try
|
||||
{
|
||||
if (move || moveBack)
|
||||
File.Move(fileHolder.FullName, to);
|
||||
File.Move(filePath.FullName, to);
|
||||
else
|
||||
File.Copy(fileHolder.FullName, to);
|
||||
File.Copy(filePath.FullName, to);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
|
Reference in New Issue
Block a user