删除早于日期的文件

时间:2012-04-24 09:52:27

标签: c# datetime logging

我目前正在开发一个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 Delete files older than 3 months old in a directory using .NET上的另一个问题,但它没有做我期望的事情。

3 个答案:

答案 0 :(得分:7)

您被迫只考虑创建时间戳的日期部分,然后条件得到满足,文件将被删除(之前),无论如何我建议对该代码进行一些修改:

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拨打maximumAgeInDays为0,那么您将延迟所有未使用的日志文件(如排除列表中所指定)。
  • 有时文件可以使用(即使在您的情况下很少发生这种情况)。 DeleteFileIfOlderThan函数会在短暂延迟后重试删除它们(它模仿Explorer.exe行为)。

您可以这样调用此功能:

Helpers.DeleteOldFiles(@"c:\mypath\", logAge, currentLog);

几点注释:

  • 此代码没有组合路径和文件名,但是如果你必须这样做,你应该使用Path.Combine(),我想你不想每次重新发明轮子以检查路径是否以是否有反斜杠。
  • I / O操作可能会失败!始终检查例外情况。

答案 1 :(得分:1)

file.Delete比File.Delete(path)更有意义,而Path.Combine()比使用string.Format更有意义。

我偶然发现了这个答案,不知道为什么我在谷歌上花了多年后没有找到它,但这似乎解决了这个问题。 DateTime.Compare how to check if a date is less than 30 days old?。另一个问题是我正在使用文件创建时间,但对于我的场景,使用lastWriteTime.date更有意义。

答案 2 :(得分:0)

我想其他问题必须在

File.Delete(string.Format("{0}/{1}", directory, file));

您的文件的类型为 FileSystemInfo 。也许你想使用 file.Name 。 示例:假设目录是“c:\”而文件指向“c:\ myfile.log”,您的代码将尝试删除“ C:/ C:\ myfile.log ”。我很难猜出你在这些变量中到底有什么。

@HenkHolterman建议正确更换:

file.Delete();