131 lines
5.5 KiB
C#
131 lines
5.5 KiB
C#
namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|
|
|
internal abstract class FileHolder
|
|
{
|
|
|
|
internal static List<Models.FileHolder> GetFileHolders((string, string[])[] collection)
|
|
{
|
|
List<Models.FileHolder> results = new();
|
|
foreach ((string _, string[] files) in collection)
|
|
results.AddRange(files.Select(l => new Models.FileHolder(l)));
|
|
return results;
|
|
}
|
|
|
|
internal static IEnumerable<Models.FileHolder> GetFileHolders(IEnumerable<(string, string)> collection)
|
|
{
|
|
foreach ((string _, string file) in collection)
|
|
yield return new(file);
|
|
}
|
|
|
|
internal static IEnumerable<(string, string[])> GetFiles(string root, string searchPattern)
|
|
{
|
|
Stack<string> pending = new();
|
|
pending.Push(root);
|
|
while (pending.Count != 0)
|
|
{
|
|
string[]? next = null;
|
|
string path = pending.Pop();
|
|
try
|
|
{
|
|
next = Directory.GetFiles(path, searchPattern);
|
|
}
|
|
catch { }
|
|
if (next is not null && next.Any())
|
|
yield return new(path, next);
|
|
try
|
|
{
|
|
next = Directory.GetDirectories(path);
|
|
foreach (string subDirectory in next)
|
|
pending.Push(subDirectory);
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
|
|
internal static (int t, List<(int g, string sourceDirectory, string[] sourceDirectoryFiles)>) GetGroupCollection(string rootDirectory, int maxImagesInDirectoryForTopLevelFirstPass, bool reverse, string searchPattern, List<string> topDirectories)
|
|
{
|
|
int result = 0;
|
|
List<(int g, string sourceDirectory, string[] sourceDirectoryFiles)> results = new();
|
|
string? parentDirectory;
|
|
string[] subDirectories;
|
|
string[] sourceDirectoryFiles;
|
|
List<string[]> fileCollections = new();
|
|
if (!topDirectories.Any())
|
|
{
|
|
if (!Directory.Exists(rootDirectory))
|
|
_ = Directory.CreateDirectory(rootDirectory);
|
|
topDirectories.AddRange(from l in Directory.GetDirectories(rootDirectory, "*", SearchOption.TopDirectoryOnly) select Path.GetFullPath(l));
|
|
}
|
|
for (int g = 1; g < 5; g++)
|
|
{
|
|
if (g == 4)
|
|
{
|
|
for (int i = fileCollections.Count - 1; i > -1; i--)
|
|
{
|
|
parentDirectory = Path.GetDirectoryName(fileCollections[i][0]);
|
|
if (string.IsNullOrEmpty(parentDirectory))
|
|
continue;
|
|
results.Add(new(g, parentDirectory, fileCollections[i]));
|
|
fileCollections.RemoveAt(i);
|
|
}
|
|
}
|
|
else if (g == 2)
|
|
{
|
|
for (int i = fileCollections.Count - 1; i > -1; i--)
|
|
{
|
|
if (fileCollections[i].Length > maxImagesInDirectoryForTopLevelFirstPass * g)
|
|
break;
|
|
parentDirectory = Path.GetDirectoryName(fileCollections[i][0]);
|
|
if (string.IsNullOrEmpty(parentDirectory))
|
|
continue;
|
|
results.Add(new(g, parentDirectory, fileCollections[i]));
|
|
fileCollections.RemoveAt(i);
|
|
}
|
|
}
|
|
else if (g == 3)
|
|
{
|
|
subDirectories = Directory.GetDirectories(rootDirectory, "*", SearchOption.AllDirectories);
|
|
if (reverse)
|
|
subDirectories = subDirectories.Reverse().ToArray();
|
|
foreach (string subDirectory in subDirectories)
|
|
{
|
|
sourceDirectoryFiles = Directory.GetFiles(subDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
result += sourceDirectoryFiles.Length;
|
|
if (!topDirectories.Contains(subDirectory))
|
|
results.Add(new(g, subDirectory, sourceDirectoryFiles));
|
|
}
|
|
}
|
|
else if (g == 1)
|
|
{
|
|
sourceDirectoryFiles = Directory.GetFiles(rootDirectory, searchPattern, SearchOption.TopDirectoryOnly);
|
|
result += sourceDirectoryFiles.Length;
|
|
if (sourceDirectoryFiles.Length > maxImagesInDirectoryForTopLevelFirstPass)
|
|
fileCollections.Add(sourceDirectoryFiles);
|
|
else
|
|
results.Add(new(g, rootDirectory, sourceDirectoryFiles));
|
|
if (reverse)
|
|
topDirectories.Reverse();
|
|
subDirectories = topDirectories.ToArray();
|
|
foreach (string subDirectory in subDirectories)
|
|
{
|
|
sourceDirectoryFiles = Directory.GetFiles(subDirectory, searchPattern, SearchOption.TopDirectoryOnly);
|
|
result += sourceDirectoryFiles.Length;
|
|
if (sourceDirectoryFiles.Length > maxImagesInDirectoryForTopLevelFirstPass)
|
|
fileCollections.Add(sourceDirectoryFiles);
|
|
else
|
|
{
|
|
if (sourceDirectoryFiles.Any() || Directory.GetDirectories(subDirectory, "*", SearchOption.TopDirectoryOnly).Any())
|
|
results.Add(new(g, subDirectory, sourceDirectoryFiles));
|
|
else if (searchPattern == "*" && subDirectory != rootDirectory)
|
|
Directory.Delete(subDirectory);
|
|
}
|
|
}
|
|
fileCollections.Reverse();
|
|
}
|
|
else
|
|
throw new Exception();
|
|
}
|
|
return new(result, results);
|
|
}
|
|
|
|
} |