2023-10-15 12:15:22 -07:00

83 lines
3.9 KiB
C#

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Phares.Shared;
using View_by_Distance.Delete.By.Relative.Models;
using View_by_Distance.Property.Models;
using View_by_Distance.Shared.Models.Methods;
namespace View_by_Distance.Delete.By.Relative;
public class DeleteByRelative
{
public DeleteByRelative(List<string> args, ILogger<Program> logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
{
if (isSilent)
{ }
if (console is null)
{ }
string relativePath;
string checkFileName;
string searchPattern = "*";
long ticks = DateTime.Now.Ticks;
Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
logger?.LogInformation(configuration.RootDirectory);
int length = configuration.RootDirectory.Length;
if (string.IsNullOrEmpty(appSettings.CompareRootDirectory) || Path.GetFullPath(appSettings.CompareRootDirectory) == Path.GetFullPath(configuration.RootDirectory))
throw new Exception("Check AppSettings file!");
IEnumerable<(string directory, string[] files)> leftCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(configuration.RootDirectory, searchPattern);
List<string> leftRelativeFiles = new();
foreach ((_, string[] files) in leftCollection)
{
foreach (string file in files)
{
relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(file, length);
leftRelativeFiles.Add(Path.GetFullPath(string.Concat(appSettings.CompareRootDirectory, relativePath)));
}
}
List<string> deleteFiles = new();
IEnumerable<(string, string[])> rightCollection = Shared.Models.Stateless.Methods.IFileHolder.GetFiles(appSettings.CompareRootDirectory, searchPattern);
foreach ((_, string[] files) in rightCollection)
{
foreach (string file in files)
{
checkFileName = Path.GetFullPath(file);
if (!leftRelativeFiles.Contains(checkFileName))
continue;
deleteFiles.Add(checkFileName);
}
}
string? alongSideDirectory;
string directoryName = Path.GetFileName(appSettings.CompareRootDirectory);
if (Path.GetPathRoot(appSettings.CompareRootDirectory) == appSettings.CompareRootDirectory)
alongSideDirectory = appSettings.CompareRootDirectory;
else
alongSideDirectory = Path.GetDirectoryName(appSettings.CompareRootDirectory);
if (alongSideDirectory is null)
throw new NullReferenceException(nameof(alongSideDirectory));
string deleteLog = Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.tsv");
File.WriteAllLines(deleteLog, deleteFiles);
if (deleteFiles.Count > 0)
{
logger?.LogInformation($"Ready to delete {deleteFiles.Count} file(s)? See <{deleteLog}>");
for (int y = 0; y < int.MaxValue; y++)
{
logger?.LogInformation("Press \"Y\" key to delete file(s) or close console to not delete files");
if (Console.ReadKey().Key == ConsoleKey.Y)
break;
}
logger?.LogInformation(". . .");
foreach (string deleteFile in deleteFiles)
{
File.Delete(deleteFile);
checkFileName = $"{deleteFile}.id";
if (!File.Exists(checkFileName))
continue;
File.Delete(checkFileName);
}
for (int i = 1; i < 5; i++)
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(appSettings.CompareRootDirectory);
}
}
}