Boa*_*rdy 5 c# logging datetime
我目前正在研究ac#program,我检查文件的创建时间,如果文件超过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(),我想你不想每次都重新发明轮子来检查路径是否以尾部反斜杠结尾.file.Delete 确实比 File.Delete(path) 更有意义,而 Path.Combine() 比使用 string.Format 更有意义。
我偶然发现了这个答案,不知道为什么我在谷歌上花了很长时间之后没有找到它,但这似乎已经解决了问题。DateTime.Compare 如何检查日期是否小于 30 天?。另一个问题是我使用的是文件创建时间,但对于我的场景来说,使用 lastWriteTime.date 更有意义。
| 归档时间: | 
 | 
| 查看次数: | 16129 次 | 
| 最近记录: |