Download SSL Certificates Sort Subtasks of Markdown files Test BioRad EAF CopyDirectories json to Markdown Sort Day 2024 Q2 GitRemoteRemove Handle directoryInfo.LinkTarget better Remove StartAt Handle directoryInfo.LinkTarget
88 lines
3.8 KiB
C#
88 lines
3.8 KiB
C#
using Microsoft.Extensions.Logging;
|
|
|
|
namespace File_Folder_Helper.Day;
|
|
|
|
internal static partial class Helper20240624
|
|
{
|
|
|
|
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}");
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
} |