namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class FileHolder { internal static List GetFileHolders((string, string[])[] collection) { List results = new(); foreach ((string _, string[] files) in collection) results.AddRange(files.Select(l => new Models.FileHolder(l))); return results; } internal static IEnumerable 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 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 topDirectories) { int result = 0; List<(int g, string sourceDirectory, string[] sourceDirectoryFiles)> results = new(); string? parentDirectory; string[] subDirectories; string[] sourceDirectoryFiles; List 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); } }