using Microsoft.Extensions.Logging; using System.Globalization; namespace File_Folder_Helper.Day.Q12024; internal static partial class Helper20240305 { private static void TryArchiveFiles(string sourceDirectory, string pattern, string archiveDirectory, string days) { string checkFile; FileInfo fileInfo; string weekOfYear; string checkDirectory; string[] directorySegments; Calendar calendar = new CultureInfo("en-US").Calendar; DateTime dateTime = DateTime.Now.AddDays(-int.Parse(days)); string[] sourceDirectorySegments = sourceDirectory.Split('/'); // DirectoryInfo directoryInfo = new(Path.GetFullPath(sourceDirectory)); // IEnumerable fileInfoCollection = directoryInfo.EnumerateFiles(pattern, new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = true }); string[] files = Directory.GetFiles(sourceDirectory, pattern, SearchOption.AllDirectories); if (!sourceDirectory.StartsWith('\\') && sourceDirectorySegments.Length < 2) throw new Exception("Can't be root drive!"); // foreach (FileInfo fileInfo in fileInfoCollection) 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, Path.DirectorySeparatorChar, string.Join(Path.DirectorySeparatorChar, directorySegments.Skip(sourceDirectorySegments.Length))); checkDirectory = string.Concat(archiveDirectory, Path.DirectorySeparatorChar, weekOfYear); for (int i = sourceDirectorySegments.Length; i < directorySegments.Length; i++) checkDirectory = string.Concat(checkDirectory, Path.DirectorySeparatorChar, directorySegments[i]); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); checkFile = Path.Combine(checkDirectory, fileInfo.Name); if (File.Exists(checkFile)) continue; // File.WriteAllText(checkFile, string.Empty); File.Move(fileInfo.FullName, checkFile); } } internal static void ArchiveFiles(ILogger logger, List args) { string days = args[4]; string pattern = args[2]; string sourceDirectory = args[0]; string archiveDirectory = Path.GetFullPath(args[3]); logger.LogInformation(sourceDirectory); TryArchiveFiles(sourceDirectory, pattern, archiveDirectory, days); } }