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

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

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile); 

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

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

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

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

过了一会儿,我们发现了这个链接: 在Windows Vista中禁用上次访问时间以提高NTFS性能

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

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

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

fsutil behavior set disablelastaccess 0

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

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

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

.NET FileInfo.LastWriteTime和FileInfo.LastAccessTime错误 ,在您的情况下也可能有用。

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

祝好运

Tigran是对的:

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