您被迫只考虑创建时间戳的日期部分,然后满足条件并且文件将被删除(较早)无论如何我建议对该代码进行一些修改:
static class Helpers {
public static void DeleteOldFiles(string folderPath, uint maximumAgeInDays,
params string[] filesToExclude) {
DateTime minimumDate = DateTime.Now.AddDays(-maximumAgeInDays);
var filesToDelete = Directory.EnumerateFiles(folderPath)
.Where(x => !IsExcluded(x, filesToExclude));
foreach (var eligibleFileToDelete in filesToDelete)
DeleteFileIfOlderThan(eligibleFileToDelete, minimumDate);
}
private const int RetriesOnError = 3;
private const int DelayOnRetry = 1000;
private static bool IsExcluded(string item, string[] exclusions) {
return exclusions.Contains(item, StringComparer.CurrentCultureIgnoreCase);
}
private static void DeleteFileIfOlderThan(string path, DateTime date)
{
for (int i = 0; i < RetriesOnError; ++i) {
try {
var file = new FileInfo(path);
if (file.CreationTime < date)
file.Delete();
}
catch (IOException) {
System.Threading.Thread.Sleep(DelayOnRetry);
}
catch (UnauthorizedAccessException) {
System.Threading.Thread.Sleep(DelayOnRetry);
}
}
}
}
笔记
- 我仍在使用
DateTime.Now
,我猜对于这种操作,您不需要任何精确测量(而且您说的是几天,所以您的线程可能有几个小时的预定时间)。
- 如果您的应用程序使用多个日志文件,您可以将它们全部指定为参数,它们将被忽略。
- 如果您
DeleteOldFiles
使用 0调用,maximumAgeInDays
那么您将延迟所有未使用的日志文件(如排除列表中指定的那样)。
- 有时文件可能正在使用中(即使在您的情况下这种情况很少发生)。该
DeleteFileIfOlderThan
函数将在短暂延迟后重试删除它们(它模仿Explorer.exe
行为)。
你可以这样调用这个函数:
Helpers.DeleteOldFiles(@"c:\mypath\", logAge, currentLog);
还有一些注意事项:
- 这段代码没有结合路径和文件名,但如果你必须这样做,你应该使用
Path.Combine()
,我想你不想每次都重新发明轮子来检查路径是否以尾部反斜杠结尾。
- I/O 操作可能会失败!始终检查异常。