我编写了一个工具,用于在工具用户指定的时间窗口内收集日志文件。到目前为止,我通过在日志文件上使用File.GetLastWriteTime方法来建立日志文件集合,将其与用户输入和收集的时间进行比较,并根据这些比较的结果进行收集。这是一个小代码片段:
DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);
但是我注意到我的工具没有收集我认为它应该完成的一些日志文件。看来这个方法返回的DateTime已经过时了(文件中最近的日志记录比这个日期时间的值更多)。
当我查看相关文件的“修改日期”时,它也“过时”,文件中的最新日志记录比“修改日期”更新。
如何才能获得准确的“GetLastWriteTime”或“修改日期”值?
答案 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,但它类似于在时间窗口内比较字段)。