using Microsoft.Extensions.Logging; namespace File_Folder_Helper.Helpers; internal static class HelperTooLong { internal static void TooLong(string workingDirectory, bool delete) { string[] files; string destination; string? parentDirectory; string[] directories = Directory.GetDirectories(workingDirectory, "*", SearchOption.TopDirectoryOnly); for (int i = 0; i < directories.Length; i++) { if (delete) { Directory.Delete(directories[i], recursive: true); break; } files = Directory.GetFiles(directories[i], "*", SearchOption.TopDirectoryOnly); for (int f = 0; f < files.Length; f++) File.Delete(files[f]); parentDirectory = Path.GetDirectoryName(directories[i]); if (string.IsNullOrEmpty(parentDirectory)) continue; destination = Path.Combine(parentDirectory, i.ToString()); if (Path.GetFileName(directories[i]).Length > 3) Directory.Move(directories[i], destination); TooLong(destination, delete); } } private static void MoveFiles(string yearName, string personKeyFormattedDirectory, string personNameDirectory, string personNameDirectoryName) { string? checkFile; string? checkDirectory; string[] files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string file in files) { checkDirectory = Path.Combine(personKeyFormattedDirectory, yearName, personNameDirectoryName); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); checkFile = Path.Combine(checkDirectory, Path.GetFileName(file)); if (File.Exists(checkFile)) continue; File.Move(file, checkFile); } } private static void MaybeMoveFiles(Models.AppSettings appSettings, string[] ticksDirectories) { string yearName; string yearDirectoryName; string[] yearDirectories; string personKeyFormatted; string ticksDirectoryName; string personNameDirectoryName; string[] personNameDirectories; string[] personKeyFormattedDirectories; foreach (string ticksDirectory in ticksDirectories) { ticksDirectoryName = Path.GetFileName(ticksDirectory); if (!long.TryParse(ticksDirectoryName, out long directoryTicks)) break; yearName = new DateTime(directoryTicks).Year.ToString(); personKeyFormattedDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personKeyFormattedDirectory in personKeyFormattedDirectories) { personKeyFormatted = Path.GetFileName(personKeyFormattedDirectory); if (personKeyFormatted.Length != appSettings.PersonBirthdayFormat.Length) break; yearDirectories = Directory.GetDirectories(personKeyFormattedDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string yearDirectory in yearDirectories) { personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly); if (personNameDirectories.Length > 1) break; if (personNameDirectories.Length == 0) continue; personNameDirectoryName = Path.GetFileName(personNameDirectories[0]); if (!personNameDirectoryName.StartsWith("X+") && personNameDirectoryName.Length != 1) break; yearDirectoryName = Path.GetFileName(yearDirectory); if (yearDirectoryName == yearName) continue; MoveFiles(yearName, personKeyFormattedDirectory, personNameDirectories[0], personNameDirectoryName); } } } } internal static void UpdateDateVerifyAndGetTicksDirectories(ILogger logger, Models.AppSettings appSettings, string directory) { string ticksDirectoryName; DirectoryInfo directoryInfo; string[] ticksDirectories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly); foreach (string ticksDirectory in ticksDirectories) { ticksDirectoryName = Path.GetFileName(ticksDirectory); if (ticksDirectoryName.Length < 3) break; if (!long.TryParse(ticksDirectoryName, out long directoryTicks)) break; directoryInfo = new(ticksDirectory); if (directoryInfo.CreationTime.Ticks != directoryTicks) Directory.SetCreationTime(ticksDirectory, new DateTime(directoryTicks)); if (directoryInfo.LastWriteTime.Ticks != directoryTicks) Directory.SetLastWriteTime(ticksDirectory, new DateTime(directoryTicks)); } MaybeMoveFiles(appSettings, ticksDirectories); HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, directory); } }