file-folder-helper/ADO2025/PI6/Helper-2025-06-18.cs

89 lines
4.0 KiB
C#

using System.Collections.ObjectModel;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI6;
internal static partial class Helper20250618 {
private record Record(string Directory, List<string> Files);
internal static void MoveAllButXOfEach(ILogger<Worker> logger, List<string> args) {
int keep = int.Parse(args[5]);
logger.LogInformation(args[0]);
logger.LogInformation(args[1]);
logger.LogInformation(args[2]);
string searchPattern = args[2];
string split = args[4].Split('~')[0];
string sourceDirectory = Path.GetFullPath(args[0].Split('~')[0]);
string destinationDirectory = Path.GetFullPath(args[3].Split('~')[0]);
if (destinationDirectory.Contains(sourceDirectory)) {
throw new Exception("Not allowed!");
}
ReadOnlyCollection<string> directories = GetDirectories(sourceDirectory);
MoveAllButXOfEachB(logger, searchPattern, sourceDirectory, destinationDirectory, split, keep, directories);
}
private static ReadOnlyCollection<string> GetDirectories(string sourceDirectory) {
List<string> results = [sourceDirectory];
results.AddRange(Directory.GetDirectories(sourceDirectory, "*", SearchOption.AllDirectories));
return results.AsReadOnly();
}
private static void MoveAllButXOfEachB(ILogger<Worker> logger, string searchPattern, string sourceDirectory, string destinationDirectory, string split, int keep, ReadOnlyCollection<string> directories) {
string[] files;
int sourceDirectoryLength = sourceDirectory.Length;
ReadOnlyDictionary<string, ReadOnlyCollection<string>> keyValuePairs;
foreach (string directory in directories) {
files = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
keyValuePairs = GetFiles(split, files);
foreach (KeyValuePair<string, ReadOnlyCollection<string>> keyValuePair in keyValuePairs) {
if (keyValuePair.Value.Count <= keep) {
continue;
} else {
MoveAllButXOfEachC(logger, sourceDirectoryLength, destinationDirectory, keyValuePair);
}
}
}
}
private static ReadOnlyDictionary<string, ReadOnlyCollection<string>> GetFiles(string split, string[] files) {
Dictionary<string, ReadOnlyCollection<string>> results = [];
string key;
List<string>? collection;
Dictionary<string, List<string>> keyValuePairs = [];
foreach (string file in files) {
key = Path.GetFileName(file).Split(split)[0];
if (!keyValuePairs.TryGetValue(key, out collection)) {
keyValuePairs.Add(key, []);
if (!keyValuePairs.TryGetValue(key, out collection)) {
throw new Exception();
}
}
collection.Add(file);
}
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs) {
results.Add(keyValuePair.Key, keyValuePair.Value.OrderByDescending(l => l).ToArray().AsReadOnly());
}
return results.AsReadOnly();
}
private static void MoveAllButXOfEachC(ILogger<Worker> logger, int sourceDirectoryLength, string destinationDirectory, KeyValuePair<string, ReadOnlyCollection<string>> keyValuePair) {
string file;
string checkFile;
string checkDirectory;
for (int i = 1; i < keyValuePair.Value.Count; i++) {
file = keyValuePair.Value[i];
checkFile = $"{destinationDirectory}{file[sourceDirectoryLength..]}";
checkDirectory = Path.GetDirectoryName(checkFile) ?? throw new Exception();
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
if (File.Exists(checkFile))
continue;
File.Move(file, checkFile);
logger.LogInformation("<{file}> moved", file);
}
}
}