diff --git a/Wabbajack.Common/Consts.cs b/Wabbajack.Common/Consts.cs index 9db5019d..07fa6143 100644 --- a/Wabbajack.Common/Consts.cs +++ b/Wabbajack.Common/Consts.cs @@ -103,5 +103,8 @@ namespace Wabbajack.Common public static string PatchCacheFolder => Path.Combine(LocalAppDataPath, "patch_cache"); public static int MaxConnectionsPerServer = 4; + + public static string LogsFolder = "logs"; + public static int MaxOldLogs = 50; } } diff --git a/Wabbajack.Common/Utils.cs b/Wabbajack.Common/Utils.cs index 1697529c..d55e6923 100644 --- a/Wabbajack.Common/Utils.cs +++ b/Wabbajack.Common/Utils.cs @@ -53,20 +53,52 @@ namespace Wabbajack.Common if (!Directory.Exists(Consts.LocalAppDataPath)) Directory.CreateDirectory(Consts.LocalAppDataPath); - if (!Directory.Exists("logs")) - Directory.CreateDirectory("logs"); + if (!Directory.Exists(Consts.LogsFolder)) + Directory.CreateDirectory(Consts.LogsFolder); var programName = Assembly.GetEntryAssembly()?.Location ?? "Wabbajack"; - LogFile = Path.Combine("logs", Path.GetFileNameWithoutExtension(programName) + ".current.log"); + LogFile = Path.Combine(Consts.LogsFolder, Path.GetFileNameWithoutExtension(programName) + ".current.log"); _startTime = DateTime.Now; - if (LogFile.FileExists()) { - var newPath = Path.Combine("logs", Path.GetFileNameWithoutExtension(programName) + (new FileInfo(LogFile)).LastWriteTime.ToString(" yyyy-MM-dd HH_mm_ss") + ".log"); + var newPath = Path.Combine(Consts.LogsFolder, Path.GetFileNameWithoutExtension(programName) + new FileInfo(LogFile).LastWriteTime.ToString(" yyyy-MM-dd HH_mm_ss") + ".log"); File.Move(LogFile, newPath, MoveOptions.ReplaceExisting); } + var logFiles = Directory.GetFiles(Consts.LogsFolder); + if (logFiles.Length >= Consts.MaxOldLogs) + { + Log($"Maximum amount of old logs reached ({logFiles.Length} >= {Consts.MaxOldLogs})"); + var filesToDelete = logFiles + .Where(File.Exists) + .OrderBy(f => + { + var fi = new FileInfo(f); + return fi.LastWriteTime; + }).Take(logFiles.Length - Consts.MaxOldLogs).ToList(); + + Log($"Found {filesToDelete.Count} old log files to delete"); + + var success = 0; + var failed = 0; + filesToDelete.Do(f => + { + try + { + File.Delete(f); + success++; + } + catch (Exception e) + { + failed++; + Log($"Could not delete log at {f}!\n{e}"); + } + }); + + Log($"Deleted {success} log files, failed to delete {failed} logs"); + } + var watcher = new FileSystemWatcher(Consts.LocalAppDataPath); AppLocalEvents = Observable.Merge(Observable.FromEventPattern(h => watcher.Changed += h, h => watcher.Changed -= h).Select(e => (FileEventType.Changed, e.EventArgs)), Observable.FromEventPattern(h => watcher.Created += h, h => watcher.Created -= h).Select(e => (FileEventType.Created, e.EventArgs)),