Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
Handle directoryInfo.LinkTarget GitRemoteRemove Handle directoryInfo.LinkTarget better Sort HelperMarkdown Sort Day 2024 Q2 u flag Better git remote management Gitea Echo
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);
|
|
}
|
|
|
|
} |