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 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.FileWatcherConfiguration.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 logger) { // http://10.95.154.10:8081/2023_Week_45/2023-11-08/a.txt string checkFile = Path.Combine(appSettings.FileWatcherConfiguration.WatchDirectory, appSettings.StratusConfiguration.WatchFile); try { TryMoveFile(appSettings, checkFile); } catch (Exception ex) { logger.LogError(ex, "Inner loop error!"); Thread.Sleep(appSettings.FileWatcherConfiguration.MillisecondsDelay * 5); } Console.WriteLine("Hello"); int days = appSettings.StratusConfiguration.Days; string pattern = appSettings.StratusConfiguration.FileDelimiterPattern; string sourceDirectory = appSettings.FileWatcherConfiguration.WatchDirectory; int millisecondsDelay = appSettings.FileWatcherConfiguration.MillisecondsDelay; 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; } }