File.GetLastWriteTime似乎返回'过时'值

时间:2012-04-03 11:22:07

标签: c# file-io windows-server-2008

我编写了一个工具,用于在工具用户指定的时间窗口内收集日志文件。到目前为止,我通过在日志文件上使用File.GetLastWriteTime方法来建立日志文件集合,将其与用户输入和收集的时间进行比较,并根据这些比较的结果进行收集。这是一个小代码片段:

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);

但是我注意到我的工具没有收集我认为它应该完成的一些日志文件。看来这个方法返回的DateTime已经过时了(文件中最近的日志记录比这个日期时间的值更多)。

当我查看相关文件的“修改日期”时,它也“过时”,文件中的最新日志记录比“修改日期”更新。

如何才能获得准确的“GetLastWriteTime”或“修改日期”值?

2 个答案:

答案 0 :(得分:10)

在我的经历中,我抛出了一些像你这样的问题。在Windows Vista / 7系统上,并非总是的功能会返回可靠的结果。

过了一会儿,我们发现了这个链接:Disabling Last Access Time in Windows Vista to improve NTFS performance

  

一位敏锐的Windows Vista用户注意到了一个名为的注册表   NtfsDisableLastAccessUpdate下   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlFileSystem并问道   我们这意味着什么。

     

上次访问时间是一个文件属性   访问或以其他方式触摸文件时更新。 (这经常是   与上次修改时间混淆,后者仅在更新时更新   文件更改。)上次访问时间仅具有松散的粒度   保证时间准确到一小时之内。

     

在Windows中   Vista,我们已禁用上次访问时间的更新以改进NTFS   性能。如果您使用的是依赖于此的应用程序   值,您可以使用以下命令启用它:

     

fsutil behavior set disablelastaccess 0

     

您必须重新启动计算机才能使此更改生效。有关Fsutil命令和上次访问时间的更多信息,   请参阅Fsutil online Help

基于此,很明显上次访问时间不能用作"强键"。要解决该问题,我们只是停止在GetLastWriteTime调用中继,但是存储文件的最后更改值或其名称,如"FileName_yyyymmdd",或存储在某个字段中的该文件中。

GetLastAccessTime还有另一种解决方案可以在这里找到:

.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong,对您的情况也很有用。

我对此的一般看法是:不要转发该参数,而是在您的架构中发明其他东西。

祝你好运

答案 1 :(得分:1)

Tigran是对的:

除了上次写入时间之外,您还可以尝试比较文件大小更改。这就是我的工作(使用FileSystemWatcher,但它类似于在时间窗口内比较字段)。