File.GetLastWriteTime似乎正在返回';过期';价值

本文关键字:过期 价值 返回 GetLastWriteTime File | 更新日期: 2023-09-27 18:29:55

我已经编写了一个工具,可以在该工具的用户指定的时间窗口内收集日志文件。到目前为止,我一直在使用File.GetLastWriteTime方法基于日志文件收集日志文件,将其与用户输入的时间进行比较,并根据这些比较的结果进行收集。下面是一个小代码片段:

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);

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

当我查看有问题的文件的"修改日期"时,它也"过时"了,文件中的日志记录比"修改日期"要多。

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

File.GetLastWriteTime似乎正在返回';过期';价值

在我的经历中,我遇到了一些像你这样的问题。在Windows Vista/7系统上,运行并不总是会返回可靠的结果。

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

一位细心的WindowsVista用户注意到一个名为NtfsDisableLastAccessUpdateHKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'ControlFileSystem并询问这意味着什么。

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

在Windows中Vista,我们已禁用对上次访问时间的更新以改进NTFS表演如果您使用的应用程序依赖于值,您可以使用以下命令启用它:

fsutil behavior set disablelastaccess 0

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

基于此,很明显,上次访问时间不能用作"强密钥"。为了解决这个问题,我们只需停止对GetLastWriteTime调用的中继,而是将文件的上次更改值或其名称(如"FileName_yyyymmdd")存储在文件中的某个字段中。

GetLastAccessTime还有另一种解决方案:

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

我对此的总体看法是:不要重复那个参数,而是在您的体系结构中发明一些其他东西。

祝好运

Tigran是对的:

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