Files
file-folder-helper/ADO2024/PI2/Helper-2024-06-24.cs

87 lines
3.8 KiB
C#

using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2024.PI2;
internal static partial class Helper20240624 {
internal static void MoveUpOneDirectory(ILogger<Worker> logger, List<string> 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<Worker> logger, string sourceDirectory, string[] files) {
string? match;
string checkFile;
FileInfo fileInfoA;
FileInfo fileInfoB;
string? checkDirectory;
List<string> deleteFiles = [];
Dictionary<string, string> 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<string, string> keyValuePair in keyValuePairs) {
File.Move(keyValuePair.Value, keyValuePair.Key);
}
Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, sourceDirectory);
}
private static void Distinct(List<string> args, string sourceDirectory, string[] deleteMatchingIdsDirectoryNames, string[] files) {
string fileName;
string directory;
List<string> distinct = [];
List<string> 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}");
}
}
}
}