using RemSound.Core; namespace RemSound.App; /// /// Housekeeping for the logs\ folder, driven by the Logging-tab preferences: report the /// folder's total size (for the startup over-size warning), prune log files older than N days, and /// delete every log on demand. All operations are best-effort — a locked or vanished file is /// skipped, never thrown, because log housekeeping must never stop the app from running. /// internal static class LogMaintenance { /// Total size in bytes of every *.log file in the logs folder. 0 if the folder /// doesn't exist yet or can't be read. public static long LogsFolderSizeBytes() { try { var dir = AppConfig.LogsDirectory; if (!Directory.Exists(dir)) return 0; long total = 0; foreach (var file in Directory.EnumerateFiles(dir, "*.log")) { try { total += new FileInfo(file).Length; } catch { /* vanished mid-scan — skip */ } } return total; } catch { return 0; } } /// Delete *.log files last written more than days ago. /// The currently-open log () is always spared even if the clock /// makes it look old. Returns how many files were deleted. public static int PruneLogsOlderThan(int days, string? activeLogPath) { if (days < 1) return 0; var deleted = 0; try { var dir = AppConfig.LogsDirectory; if (!Directory.Exists(dir)) return 0; var cutoff = DateTime.Now.AddDays(-days); foreach (var file in Directory.EnumerateFiles(dir, "*.log")) { if (IsSamePath(file, activeLogPath)) continue; try { if (File.GetLastWriteTime(file) < cutoff) { File.Delete(file); deleted++; } } catch { /* locked / in use — leave it */ } } } catch { /* folder enumeration failed — give up quietly */ } return deleted; } /// Delete every *.log file except the one currently being written /// (, which is held open and can't be removed anyway). Returns /// how many files were deleted. public static int DeleteAllLogs(string? activeLogPath) { var deleted = 0; try { var dir = AppConfig.LogsDirectory; if (!Directory.Exists(dir)) return 0; foreach (var file in Directory.EnumerateFiles(dir, "*.log")) { if (IsSamePath(file, activeLogPath)) continue; try { File.Delete(file); deleted++; } catch { /* locked / in use — leave it */ } } } catch { /* give up quietly */ } return deleted; } private static bool IsSamePath(string a, string? b) => !string.IsNullOrEmpty(b) && string.Equals(Path.GetFullPath(a), Path.GetFullPath(b), StringComparison.OrdinalIgnoreCase); }