using Microsoft.Extensions.Logging; namespace File_Folder_Helper.ADO2024.PI2; internal static partial class Helper20240624 { internal static void MoveUpOneDirectory(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); } } 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}"); } } } }