diff --git a/CrashReporter/CrashReporter.cs b/CrashReporter/CrashReporter.cs
index 4b01731..5db8b53 100644
--- a/CrashReporter/CrashReporter.cs
+++ b/CrashReporter/CrashReporter.cs
@@ -327,9 +327,11 @@ public static string CreateDump(CoreType coreType)
///
public static string CreateDump(string fileName, CoreType coreType)
{
- try {
- CleanUpDump();
- } catch { /* Ignore any errors while trying to clean up the dump, so we can continue to crash */ }
+ if (fileName == null) {
+ try {
+ CleanUpDump();
+ } catch { /* Ignore any errors while trying to clean up the dump, so we can continue to crash */ }
+ }
string crashDumpFile = null;
if (fileName != null) {
@@ -394,26 +396,43 @@ public static string CreateDump(string fileName, CoreType coreType)
return dumpFileName;
}
- private static Regex s_CrashFileRegex;
+ private const long GbMultiplier = 1024 * 1024 * 1024;
- private static Regex CrashFileRegEx
+ ///
+ /// Removes old dump files from the default dump directory created when using .
+ ///
+ ///
+ /// Over time, the number of files in the dump may take a significant amount of space. This method allows to
+ /// programmatically remove old dumps and large dumps as disk space is reduced.
+ ///
+ /// A log might be required to be deleted, but if there is a file system error, it will be skipped.
+ ///
+ ///
+ public static void CleanUpDump()
{
- get
- {
- if (s_CrashFileRegex == null) {
- s_CrashFileRegex = new Regex(Crash.CrashPathRegEx);
- }
- return s_CrashFileRegex;
- }
+ string dumpFolder = Crash.GetCrashFolder();
+ CleanUpDump(dumpFolder, Crash.CrashPathRegEx);
}
- private const long GbMultiplier = 1024 * 1024 * 1024;
+ ///
+ /// Removes old dump files from the default dump directory created when using .
+ ///
+ /// The dump folder to clean.
+ ///
+ /// is .
+ ///
+ public static void CleanUpDump(string dumpFolder)
+ {
+ CleanUpDump(dumpFolder, null);
+ }
///
/// Removes old dump files from the default dump directory created when using .
///
- ///
- /// The platform is not supported, so delete operations can't be performed.
+ /// The dump folder to clean.
+ /// The file match regular expression to only erase dumps that match.
+ ///
+ /// is .
///
///
/// Over time, the number of files in the dump may take a significant amount of space. This method allows to
@@ -426,17 +445,20 @@ private static Regex CrashFileRegEx
Justification = "Kept in case ordering is changed to reduce possible bugs")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0059:Unnecessary assignment of a value",
Justification = "Kept in case ordering is changed to reduce possible bugs")]
- public static void CleanUpDump()
+ public static void CleanUpDump(string dumpFolder, string fileMatchRegEx)
{
- string dumpFolder;
- try {
- dumpFolder = Crash.GetCrashFolder();
- } catch (PlatformNotSupportedException) {
- return;
- }
+ if (dumpFolder == null) throw new ArgumentNullException(nameof(dumpFolder));
if (!Directory.Exists(dumpFolder)) return;
- Regex crashFileRegex = CrashFileRegEx;
+ Regex crashFileRegex = null;
+ if (fileMatchRegEx != null) {
+ try {
+ crashFileRegex = new Regex(fileMatchRegEx);
+ } catch (ArgumentException) {
+ // Ignore invalid regex. We don't clean.
+ return;
+ }
+ }
IList crashCandidates = new List();
DirectoryInfo directory;
@@ -450,7 +472,7 @@ public static void CleanUpDump()
DirectoryInfo[] subDirs = directory.GetDirectories();
if (subDirs != null) {
foreach (DirectoryInfo subDir in subDirs) {
- if (crashFileRegex.IsMatch(subDir.Name)) {
+ if (crashFileRegex == null || crashFileRegex.IsMatch(subDir.Name)) {
crashCandidates.Add(subDir);
}
}
@@ -459,20 +481,14 @@ public static void CleanUpDump()
FileInfo[] files = directory.GetFiles();
if (files != null) {
foreach (FileInfo file in files) {
- string nameNoExt = Path.GetFileNameWithoutExtension(file.Name);
- if (crashFileRegex.IsMatch(nameNoExt)) {
+ if (crashFileRegex == null || crashFileRegex.IsMatch(file.Name)) {
crashCandidates.Add(file);
}
}
}
- // Delete everything more than 45 days old
crashCandidates = CleanUpDumpOld(Config.CrashDumper.DumpDir.AgeDays, crashCandidates);
-
- // Keep the 40 newest sets of logs
crashCandidates = CleanUpDumpKeepNewest(Config.CrashDumper.DumpDir.MaxLogs, crashCandidates);
-
- // 1000MB or 10% should be minimum free space, but keep the last 5 files always
crashCandidates = CleanUpKeepSpace(
drive,
Config.CrashDumper.DumpDir.ReserveFree * GbMultiplier, Config.CrashDumper.DumpDir.ReserveFreePercent,
diff --git a/CrashReporter/Dump/Crash.cs b/CrashReporter/Dump/Crash.cs
index db062af..035d0d1 100644
--- a/CrashReporter/Dump/Crash.cs
+++ b/CrashReporter/Dump/Crash.cs
@@ -184,7 +184,7 @@ public string GetCrashDir(string prefix)
return crashDir;
}
- internal const string CrashPathRegEx = @"-\d{14}\.[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
+ internal const string CrashPathRegEx = @"-\d{14}\.[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(\.zip)?$";
internal static string GetCrashFolder()
{