using Microsoft.Extensions.Logging; using System.Globalization; namespace File_Folder_Helper.ADO2024.PI3; internal static partial class Helper20240806 { private static void TryArchiveFiles(string sourceDirectory, string pattern, string archiveDirectory, int minimumLength, 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 < 1) throw new Exception("Can't be root drive!"); foreach (string file in files) { fileInfo = new FileInfo(file); if (string.IsNullOrEmpty(fileInfo.DirectoryName) || fileInfo.IsReadOnly || fileInfo.Length < minimumLength || fileInfo.LastWriteTime < dateTime) continue; directorySegments = fileInfo.DirectoryName.Split(Path.DirectorySeparatorChar); if (directorySegments.Length < sourceDirectorySegments.Length) continue; weekOfYear = $"{fileInfo.LastWriteTime.Year}_Week_{calendar.GetWeekOfYear(fileInfo.LastWriteTime, 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.LastWriteTime.ToString("yyyy-MM-dd")); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); checkFile = Path.Combine(checkDirectory, string.Concat(fileInfo.LastWriteTime.ToString("HH-mm-ss-fff"), "~", fileInfo.Name)); if (File.Exists(checkFile)) continue; File.Move(fileInfo.FullName, checkFile); } } internal static void ArchiveFiles(ILogger logger, List args) { string pattern = args[4]; int days = int.Parse(args[6]); logger.LogInformation("Hello"); string sourceDirectory = args[0]; int minimumLength = int.Parse(args[5]); int millisecondsDelay = int.Parse(args[2]); string archiveDirectory = Path.GetFullPath(args[7]); TryArchiveFiles(sourceDirectory, pattern, archiveDirectory, minimumLength, days); Thread.Sleep(millisecondsDelay); } }