.NET FileInfo.LastWriteTime和FileInfo.LastAccessTime是错误的

Mr.*_*ble 21 .net c# windows fileinfo

当我调用FileInfo(path).LastAccessTimeFileInfo(path).LastWriteTime正在写入的文件时,它返回创建文件的时间,而不是上次写入文件的时间(即现在).

有没有办法获得这些信息?

编辑:到目前为止的所有回复.我没有尝试,Refresh()但也没有尝试过.我返回文件开始写入的时间.静态方法也是如此,并创建了一个新的实例FileInfo.

Codymanix可能有答案,但我没有运行Windows Server(使用Windows 7),我不知道设置的测试位置.

编辑2:没有人觉得这个功能似乎不起作用很有趣?

Tom*_*ier 14

这些FileInfo值仅加载一次然后缓存.要获取当前值,请Refresh()在获取属性之前调用:

f.Refresh();
t = f.LastAccessTime;
Run Code Online (Sandbox Code Playgroud)

获取当前值的另一种方法是使用File类上的静态方法:

t = File.GetLastAccessTime(path);
Run Code Online (Sandbox Code Playgroud)

  • t = File.GetLastAccessTime(path); 如果进程已保存但正在锁定文件,则仍然是过时的。这个答案是不正确的。 (3认同)

Jam*_*acs 8

从Windows Vista开始,默认情况下不会更新上次访问时间.这是为了提高文件系统性能.你可以在这里找到细节:

http://blogs.technet.com/b/filecab/archive/2006/11/07/disabling-last-access-time-in-windows-vista-to-improve-ntfs-performance.aspx

要重新启用计算机上的最后访问时间,可以运行以下命令:

fsutil行为设置disablelastaccess 0


Alo*_*aus 5

正如 James 指出的LastAccessTime 没有更新


自 Vista 以来,LastWriteTime 也经历了一些变化。当进程仍然打开文件并且另一个进程检查 LastWriteTime 时,它​​将在很长一段时间内看不到新的写入时间——直到进程关闭文件。

作为解决方法,您可以从外部进程打开和关闭文件。完成后,您可以尝试再次读取 LastWriteTime,这是最新值。


文件系统隧道:

如果应用程序实现了诸如关闭文件的滚动记录器之类的功能,然后将其重命名为不同的文件名,您也会遇到问题,因为操作系统会记住“旧”文件的创建时间和文件大小,尽管您确实创建了一个新文件。这包括文件大小的错误报告,即使您确实从头开始重新创建了大小仍然为 0 字节的 log.txt。此功能称为 OS 文件系统隧道,它仍然存在于 Windows 8.1 中。有关如何解决此问题的示例,请查看Enterprise Library 中的 RollingFlatFileTracelistener

您可以从 cmd shell 中查看文件系统隧道对您自己机器的影响。

echo test > file1.txt
ren file1.txt file2.txt
Wait one minute
echo test > file1.txt

dir  /tc file*.txt
...
05.07.2015  19:26                 7 file1.txt
05.07.2015  19:26                 7 file2.txt
Run Code Online (Sandbox Code Playgroud)

文件系统是一个状态机。如果您关心性能和正确性,则很难保持状态正确同步。

这种奇怪的隧道综合症显然仍然被应用程序使用,例如自动保存文件并将其移动到保存位置,然后在同一位置再次重新创建文件。对于这些应用程序,给文件一个新的创建日期是有意义的,因为它只是被复制了。一些安装程序也会使用这样的技巧来临时将文件移动到不同的位置,并稍后将内容写回以通过某些文件是否存在检查某些安装挂钩。


Jon*_*eet 4

您是否尝试Refresh()在访问该属性之前调用(以避免获取缓存值)?如果这不起作用,您是否查看了资源管理器同时显示的内容?如果资源管理器显示错误的信息,那么它可能是您无法真正解决的问题 - 例如,该信息可能仅在文件句柄关闭时更新。