删除早于某个日期的文件
本文关键字:文件 日期 于某个 删除 | 更新日期: 2023-09-27 18:32:07
我目前正在开发一个 c# 程序,我在其中检查文件的创建时间,如果文件超过 2 天,则将其删除。我有以下代码片段应该可以实现这一点。
DateTime creationTime = file.CreationTime.Date;
if (creationTime < DateTime.Now.AddDays(-logAge) && file.Name != currentLog)
{
File.Delete(string.Format("{0}/{1}", directory, file));
}
当我的程序运行时,它会不断创建新文件,并且一个单独的线程会检查文件是否不超过 2 天。如果我将 PC 的日期设置为 4 月 24 日,则会按预期创建并保存文件,如果我随后将 PC 的日期更改为 4 月 25 日,我希望文件保留,因为它们不超过 2 天,但是,情况并非如此,因为它们正在被删除。
日志年龄设置为 因此,在我将日期更改为 4 月 26 日之前,我不会期望删除文件。
我做错了什么,我看了很多例子,包括另一个关于 Stackoverflow 使用 .NET 删除目录中超过 3 个月的文件的问题,但它没有做我期望的事情。
您被迫只考虑创建时间戳的日期部分,然后满足条件,无论如何文件都将被删除(更早) 我建议对该代码进行一些修改:
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 操作可能会失败!始终检查异常。
文件。删除确实比File.Delete(path)更有意义,Path.Combine()比使用字符串更有意义。格式。
我偶然发现了这个答案,不知道为什么在谷歌上花费了很长时间后我没有事先找到它,但这似乎已经解决了这个问题。日期时间。比较如何检查日期是否少于 30 天?。另一个问题是我正在使用文件创建时间,但对于我的场景,使用 lastWriteTime.date 更有意义。
我想一定有一个额外的问题
File.Delete(string.Format("{0}/{1}", directory, file));
您的文件类型为文件系统信息。也许你想使用文件。名称。示例:假设目录是"c:''"并且文件指向"c:''myfile.log",您的代码将尝试删除"c:/c:''myfile.log"。我很难猜测你在这些变量中到底有什么。
@HenkHolterman建议正确更换:
file.Delete();