using Microsoft.Extensions.Logging; namespace File_Folder_Helper.Day; internal static partial class Helper20240624 { private static void MoveUpOndDirectory(ILogger logger, string sourceDirectory, string[] files) { string? match; string checkFile; FileInfo fileInfoA; FileInfo fileInfoB; string? checkDirectory; List deleteFiles = []; Dictionary keyValuePairs = []; foreach (string file in files) { checkDirectory = Path.GetDirectoryName(Path.GetDirectoryName(file)) ?? throw new NotSupportedException(); checkFile = Path.Combine(checkDirectory, Path.GetFileName(file)); if (File.Exists(checkFile)) throw new NotSupportedException(); if (keyValuePairs.TryGetValue(checkFile, out match)) { fileInfoA = new(file); fileInfoB = new(match); if (fileInfoA.Length != fileInfoB.Length) throw new NotSupportedException("Files don't match!"); logger.LogWarning("<{file}> already exists!", file); deleteFiles.Add(file); continue; } keyValuePairs.Add(checkFile, file); } foreach (string file in deleteFiles) File.Delete(file); foreach (KeyValuePair keyValuePair in keyValuePairs) File.Move(keyValuePair.Value, keyValuePair.Key); Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, sourceDirectory); } private static void Distinct(List args, string sourceDirectory, string[] deleteMatchingIdsDirectoryNames, string[] files) { string fileName; string directory; List distinct = []; List duplicate = []; string[] keepMatchingIdsDirectoryNames = args[4].Split(','); if (deleteMatchingIdsDirectoryNames.Length != keepMatchingIdsDirectoryNames.Length) throw new NotSupportedException("Check arg lengths!"); string[] keepMatchingIdsDirectories = keepMatchingIdsDirectoryNames.Select(l => Path.Combine(sourceDirectory, l)).ToArray(); string[] deleteMatchingIdsDirectories = deleteMatchingIdsDirectoryNames.Select(l => Path.Combine(sourceDirectory, l)).ToArray(); foreach (string file in files) { fileName = Path.GetFileName(file); if (distinct.Contains(fileName)) { duplicate.Add(fileName); continue; } distinct.Add(Path.GetFileName(file)); } foreach (string file in files) { fileName = Path.GetFileName(file); directory = Path.GetDirectoryName(file) ?? throw new NotSupportedException(); if (!duplicate.Contains(fileName)) continue; if (deleteMatchingIdsDirectories.Contains(directory)) File.Move(file, $"{file}.del"); else if (!keepMatchingIdsDirectories.Contains(directory)) throw new NotSupportedException($"Missing <{Path.GetFileName(directory)}> as a directory for {fileName}"); } } internal static void MoveUpOndDirectory(ILogger logger, List args) { string searchPattern = args[2]; string sourceDirectory = Path.GetFullPath(args[0]); string[] deleteMatchingIdsDirectoryNames = args[3].Split(','); string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories); if (deleteMatchingIdsDirectoryNames.Length == 0) MoveUpOndDirectory(logger, sourceDirectory, files); else Distinct(args, sourceDirectory, deleteMatchingIdsDirectoryNames, files); } }