using Microsoft.Extensions.Logging; namespace File_Folder_Helper.Helpers; internal static class HelperDeleteEmptyDirectories { private static void DeleteOldLogFilesAndDeleteEmptyDirectories(long? ticks, string? searchPattern, string checkDirectory, List deletedDirectories) { string[] files; FileInfo fileInfo; string[] directories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly); if (ticks is not null && !string.IsNullOrEmpty(searchPattern)) { files = Directory.GetFiles(checkDirectory, searchPattern, SearchOption.TopDirectoryOnly); foreach (string file in files) { fileInfo = new(file); if (fileInfo.LastWriteTime.Ticks > ticks) continue; File.Delete(file); } } if (directories.Length > 0) files = Array.Empty(); else files = Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly); if (directories.Length == 0 && files.Length == 0) { try { Directory.Delete(checkDirectory); } catch (UnauthorizedAccessException) { new DirectoryInfo(checkDirectory).Attributes = FileAttributes.Normal; Directory.Delete(checkDirectory); } deletedDirectories.Add(checkDirectory); } else { List check = new(); foreach (string directory in directories) { DeleteOldLogFilesAndDeleteEmptyDirectories(ticks, searchPattern, directory, check); deletedDirectories.AddRange(check); if (check.Count > 0 && Directory.Exists(directory)) DeleteOldLogFilesAndDeleteEmptyDirectories(ticks, searchPattern, directory, deletedDirectories); } } } private static void DeleteOldLogFilesAndDeleteEmptyDirectories(ILogger logger, long? ticks, string? searchPattern, string rootDirectory) { List check = new(); List directories = Directory.GetDirectories(rootDirectory, "*", SearchOption.TopDirectoryOnly).ToList(); directories.Add(rootDirectory); foreach (string directory in directories) { logger.LogInformation("{directoryName}", Path.GetFileName(directory)); for (int i = 1; i < 50; i++) { if (!Directory.Exists(directory)) break; check.Clear(); DeleteOldLogFilesAndDeleteEmptyDirectories(ticks, searchPattern, directory, check); if (check.Count == 0) break; } } } internal static void DeleteEmptyDirectories(ILogger logger, string rootDirectory) { long? ticks = null; string? searchPattern = null; DeleteOldLogFilesAndDeleteEmptyDirectories(logger, ticks, searchPattern, rootDirectory); } internal static void DeleteOldLogFilesAndDeleteEmptyDirectories(ILogger logger, string rootDirectory) { long ticks = DateTime.Now.AddHours(-120).Ticks; DeleteOldLogFilesAndDeleteEmptyDirectories(logger, ticks, "*.log", rootDirectory); DeleteOldLogFilesAndDeleteEmptyDirectories(logger, ticks, "*.log.*", rootDirectory); } }