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

Duk*_*ade 7 c# file-io windows-server-2008

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

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tig*_*ran 10

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

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

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

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

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

fsutil behavior set disablelastaccess 0

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

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

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

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

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

祝好运

  • 我对文件创建日期感到头疼.如果您创建文件,删除它并再次创建(具有相同的名称)创建日期将是以前创建的文件.过了一会儿,我发现如果在15秒内重新创建文件,操作系统会从缓存中恢复日期.解决方案是每次更改文件名,就像你提到的那样. (3认同)