File.GetLastWriteTime似乎返回了“过时”的值

9

我编写了一个工具,用于按照用户指定的时间窗口收集日志文件。迄今为止,我一直在使用 File.GetLastWriteTime 方法来基于日志文件的最近写入时间进行日志文件的收集,将其与用户输入的时间进行比较,并根据这些比较结果进行收集。以下是一个小的代码片段:

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);

然而,我注意到我的工具没有收集一些我认为应该收集的日志文件。似乎此方法返回的 DateTime 已经过期(文件中有比此日期时间值更近的日志记录)。

当我查看相关文件的“修改日期”时,它也是“过期的”,因为文件中有���“修改日期”更近的日志记录。

我如何获取准确的 “GetLastWriteTime” 或者 “修改日期” 值呢?


这句话的意思是“由该方法返回的DateTime已过时”。 - V4Vendetta
1
日期长时间不更新?例如,当您看到修改日期是“过时的”时,请等待约30秒,然后再次检查日期。 - Renatas M.
1
也可以阅读这篇文章:http://blogs.technet.com/b/asiasupp/archive/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file-without-closing-it.aspx 或许你正在遇到相同的问题。 - Renatas M.
可能是重复的问题:.NET FileInfo.LastWriteTime&FileInfo.LastAccessTime 错误 - StayOnTarget
3个回答

15

在我的经验中,我遇到了与你类似的问题。在Windows Vista / 7系统上,该函数并非总是返回可靠结果。

过了一段时间,我们找到了这个链接:禁用Windows Vista中的最后访问时间以提高NTFS性能

一个细心的Windows Vista用户注意到了一个名为 NtfsDisableLastAccessUpdate 的注册表项,在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlFileSystem下,然后问我们这是什么意思。

最后访问时间是文件属性,当文件被访问或者被其他方式触碰时更新。(通常将其与最后修改时间混淆,后者仅在文件更改时更新)。最后访问时间具有宽松的粒度,只保证时间准确到一小时内。

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

fsutil行为设置disablelastaccess 0

必须重新启动计算机才能使更改生效。有关Fsutil命令和最后访问时间的更多信息,请参见Fsutil在线帮助文档

基于此,变得清晰的是最后访问时间不能作为“强密钥”使用。要解决这个问题,我们只需停止依赖GetLastWriteTime调用,而是存储文件的最后更改值或在其名称中存储,如"FileName_yyyymmdd",或在文件内部的某个字段中。

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

.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong,在你的情况下也可能很有用。

我的一般看法是:不要依赖该参数,而是在你的架构中发明其他东西。祝你好运。


7
我曾遇到文件创建日期的头痛问题。如果你创建一个文件,删除它并再次创建(使用相同的名称),则创建日期将是之前创建的文件的日期。后来我发现,在15秒内重新创建的文件,操作系统会从缓存中恢复日期。解决方法是每次更改文件名,就像你提到的那样。 - Renatas M.
1
@Reniuz:听起来很熟悉 :) 实际上,由于我们有很多来自完全不同国家/文化的客户,从Windows XP-> Windows7 64位,像那样不可靠的信息是绝对不能接受的。 - Tigran
1
这个问题在Windows 10中已经修复了吗? - Martin Braun
但是...但是...但是... LastAccessTimeLastWriteTime无关。无论LastAccessTime被记录有什么问题,LastWriteTime都没有这些问题。 - undefined

2

Tigran是正确的:

你可以尝试比较文件大小变化,除了最后的写入时间。这就是我所做的(使用FileSystemWatcher,但它类似于在时间窗口内比较字段)。


0
如果你能以某种方式说服你的记录器尽可能频繁地关闭和重新打开(或以其他方式完全刷新)日志文件,那么你应该能够获得准确的结果。
我还不得不解决一个FileSystemWatcher(用于文件长度而不是时间戳),我发现只有当文件关闭时,NTFS才会以FileSystemWatcher可检测到的方式更新其数据结构。
尽管如此,使用时间戳,不要期望每几秒钟就能获得更好的准确性。使用文件长度可能会获得更好的准确性。
"完全刷新:你可以尝试使用FlushFileBuffers(handle)来提高成功率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接