File.GetLastWriteTime似乎正在返回';过期';价值
本文关键字:过期 价值 返回 GetLastWriteTime File | 更新日期: 2023-09-27 18:29:55
我已经编写了一个工具,可以在该工具的用户指定的时间窗口内收集日志文件。到目前为止,我一直在使用File.GetLastWriteTime方法基于日志文件收集日志文件,将其与用户输入的时间进行比较,并根据这些比较的结果进行收集。下面是一个小代码片段:
DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);
然而,我注意到我的工具没有收集一些我认为应该收集的日志文件。此方法返回的DateTime似乎已过期(文件中最近的日志记录比此日期时间的值多)。
当我查看有问题的文件的"修改日期"时,它也"过时"了,文件中的日志记录比"修改日期"要多。
如何获得准确的"GetLastWriteTime"或"修改日期"值?
在我的经历中,我遇到了一些像你这样的问题。在Windows Vista/7系统上,运行并不总是会返回可靠的结果。
过了一段时间,我们发现了这个链接:在Windows Vista中禁用上次访问时间以提高NTFS性能
一位细心的WindowsVista用户注意到一个名为
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是错误的,在您的情况下也可能有用。
我对此的总体看法是:不要重复那个参数,而是在您的体系结构中发明一些其他东西。
祝好运
Tigran是对的:
除了上次写入时间外,您还可以尝试比较文件大小的更改。这就是我所做的(使用FileSystemWatcher,但它类似于在一个时间窗口内比较字段)。