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,但它类似于比较时间窗口内的字段)。