file-watcher/Helpers/HelperStratus.cs
2024-07-26 22:57:39 -07:00

108 lines
5.0 KiB
C#

using File_Watcher.Models;
using System.Globalization;
using System.Text.RegularExpressions;
namespace File_Watcher.Helpers;
internal static partial class HelperStratus
{
// Batch FINAL QA_28_00_12 finished at 10/28/23 00:14. Elapsed time 00:01:34.
// Cassette 1T614291 finished.
// Mean 9.091, STDD 0.0091
private static void TryMoveFile(AppSettings appSettings, string checkFile)
{
string line;
string checkDirectory;
string weekYearDirectory;
List<string> collection = [];
FileInfo fileInfo = new(checkFile);
Calendar calendar = new CultureInfo("en-US").Calendar;
char start = appSettings.StratusConfiguration.FileDelimiterPattern[0];
string[] lines = !fileInfo.Exists ? [] : File.ReadAllLines(checkFile);
string weekOfYear = calendar.GetWeekOfYear(fileInfo.CreationTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
for (int i = 0; i < lines.Length; i++)
{
line = lines[i];
collection.Add(line);
if (line.Length < 1 || line[0] != start)
continue;
if (!Regex.Match(line, appSettings.StratusConfiguration.FileDelimiterPattern).Success)
continue;
weekYearDirectory = Path.Combine(appSettings.WatchDirectory, $"{fileInfo.CreationTime.Year}_Week_{weekOfYear}");
checkDirectory = Path.Combine(weekYearDirectory, fileInfo.CreationTime.ToString("yyyy-MM-dd"));
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
File.WriteAllLines(Path.Combine(checkDirectory, $"{fileInfo.CreationTime.Ticks}.txt"), collection);
collection.Clear();
for (int j = i + 1; j < lines.Length; j++)
collection.Add(lines[j]);
File.WriteAllLines(checkFile, collection);
collection.Clear();
break;
}
}
private static void TryArchiveFilesFramework(string sourceDirectory, string pattern, string archiveDirectory, int days)
{
string checkFile;
FileInfo fileInfo;
string weekOfYear;
string checkDirectory;
string[] directorySegments;
DateTime dateTime = DateTime.Now.AddDays(-days);
Calendar calendar = new CultureInfo("en-US").Calendar;
string[] sourceDirectorySegments = sourceDirectory.Split(Path.DirectorySeparatorChar);
string[] files = Directory.GetFiles(sourceDirectory, pattern, SearchOption.AllDirectories);
if (sourceDirectorySegments.Length < 2)
throw new Exception("Can't be root drive!");
foreach (string file in files)
{
fileInfo = new FileInfo(file);
if (string.IsNullOrEmpty(fileInfo.DirectoryName) || fileInfo.LastWriteTime > dateTime)
continue;
directorySegments = fileInfo.DirectoryName.Split(Path.DirectorySeparatorChar);
if (directorySegments.Length < sourceDirectorySegments.Length)
continue;
weekOfYear = $"{fileInfo.CreationTime.Year}_Week_{calendar.GetWeekOfYear(fileInfo.CreationTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
checkDirectory = string.Concat(archiveDirectory, Path.DirectorySeparatorChar, weekOfYear);
for (int i = sourceDirectorySegments.Length; i < directorySegments.Length; i++)
checkDirectory = string.Concat(checkDirectory, Path.DirectorySeparatorChar, directorySegments[i]);
checkDirectory = string.Concat(checkDirectory, Path.DirectorySeparatorChar, fileInfo.CreationTime.ToString("yyyy-MM-dd"));
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
checkFile = Path.Combine(checkDirectory, fileInfo.Name);
if (File.Exists(checkFile))
continue;
File.Move(fileInfo.FullName, checkFile);
}
}
internal static bool MoveFile(AppSettings appSettings, ILogger<Worker> logger)
{
// http://10.95.154.10:8081/2023_Week_45/2023-11-08/a.txt
string checkFile = Path.Combine(appSettings.WatchDirectory, appSettings.StratusConfiguration.WatchFile);
try
{ TryMoveFile(appSettings, checkFile); }
catch (Exception ex)
{
logger.LogError(ex, "Inner loop error!");
Thread.Sleep(appSettings.MillisecondsDelay * 5);
}
Console.WriteLine("Hello");
int days = appSettings.StratusConfiguration.Days;
string sourceDirectory = appSettings.WatchDirectory;
int millisecondsDelay = appSettings.MillisecondsDelay;
string pattern = appSettings.StratusConfiguration.FileDelimiterPattern;
string archiveDirectory = Path.GetFullPath(appSettings.StratusConfiguration.Destination);
try
{ TryArchiveFilesFramework(sourceDirectory, pattern, archiveDirectory, days); }
catch (Exception ex)
{
logger.LogError(ex, "Inner loop error!");
Thread.Sleep(millisecondsDelay * 5);
}
return true;
}
}