.NET FileInfo.LastWriteTime&FileInfo.LastAccessTim

2019-07-18 14:53发布

当我打电话FileInfo(path).LastAccessTimeFileInfo(path).LastWriteTime上的文件是在被写入返回该文件的创建时间的过程,而不是它被写入最后的时间(即现在) 。

有没有一种方法来获取这些信息?

编辑:所有的答复为止。 我没试过Refresh()但不这样做,要么。 我回到该文件已开始被写入的时间。 这同样适用于静态方法,并创建一个新实例FileInfo

Codymanix可能有答案,但我没有运行Windows Server(使用Windows 7),我不知道在哪里设置进行测试。

编辑2:没有人发现它有趣的是,这个功能似乎并没有工作?

Answer 1:

FileInfo值只加载一次,然后缓存。 为了得到当前值,调用Refresh()得到一个属性之前:

f.Refresh();
t = f.LastAccessTime;

得到当前值的另一种方法是使用在静态方法File类:

t = File.GetLastAccessTime(path);


Answer 2:

在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



Answer 3:

你有没有打过电话Refresh()刚刚访问属性(以避免受到缓存值)之前? 如果不工作,你有没有看什么资源管理器显示在同一时间? 如果资源管理器显示错误信息,那么它可能是你无法真正解决 - 这可能是该信息只更新当文件句柄被关闭,例如。



Answer 4:

有一个在这有时特别设置服务器系统以使文件修改,保存时间不能获得更好的性能设置窗口的设置。



Answer 5:

从MSDN:

当第一次调用,调用FileSystemInfo刷新并返回在API的高速缓存的信息获得的属性等。 在随后的调用,必须调用刷新获取信息的最新副本。

FileSystemInfo.Refresh()

如果你的应用是一个做写作,我认为你将不得不通过设置LastWriteTime属性你写的每个数据缓冲区间你自己“摸”的文件。 一些伪代码:

while(bytesWritten < totalBytes)
{
   bytesWritten += br.Write(buffer);
   myFileInfo.LastWriteTime = DateTime.Now;
}

我不知道这将如何严重影响写入性能。



Answer 6:

正如詹姆斯指出的LastAccessTime没有更新


该LastWriteTime也发生因为Vista中的一个转折。 当进程具有文件仍处于打开状态,而另一进程检查它不会看到很长一段时间,新的写入时间LastWriteTime -直到该进程已关闭该文件。

作为一种变通方法,您可以打开并从外部进程关闭文件。 当你这样做,你可以尝试再次读取LastWriteTime这则最新的值。


文件系统隧道:

如果一个应用程序实现类似的滚动记录其关闭文件,然后将其重命名为不同的文件名也将因为“旧”文件的创建时间和文件大小遇到的问题是由OS想起你虽然创建一个新的文件。 这包括即使你没有从头开始重新仍然是0字节log.txt的文件大小的错误报告。 此功能称为OS文件系统隧道这是仍然存在的Windows 8.1。 一个例子如何解决这个问题,看看从企业库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

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

这种奇特的隧道症候群显然仍在使用的应用程序,它都如在相同的位置再次自动保存文件并将其移动到一个保存位置,然后重新创建该文件。 对于这些应用,使得感知到为文件指定新的创建日期,因为它是大约只有复制。 有些安装程序也做这样的技巧来临时将文件移动到不同的位置,回来以后写的内容,让过去的一些文件进行一些安装钩子存在检查。



Answer 7:

汤米CARLIER的回答让我思考....

以可视化的差异的一个好方法是seperately运行两个片段(我只是用LinqPAD)simliar以下,同时运行的Sysinternals进程监视器。

while(true)
    File.GetLastAccessTime([file path here]);

FileInfo bob = new FileInfo(path);

while(true){
    string accessed = bob.LastAccessTime.ToString();
}

如果你看一下进程监视器运行时,你会看到重复的第一个片段,不断访问尝试为LinqPAD过程中的文件。 第二个片段会做的文件,您将看到在过程监控活动的初始接入,然后很少算账。

但是如果你去和修改文件(我刚刚打开的文本文件我用FileInfo的监测和加入一个字符,保存的),你会看到一系列的访问尝试由LinqPAD过程中过程监控的文件。

这说明了分别在两个不同的技术途径的非缓存和缓存的行为。

将非缓存的方式穿在硬盘驱动器中的孔?

编辑

我(做处理之前基本上在一个循环中坐,并说“有文件改变的 - 已-文件更改...”)走了感觉高明在我的测试,然后使用了FileInfo的缓存行为在我的窗口服务

虽然这种方法在我的dev的盒子的工作,也没有在生产环境中工作,即过程只是不停如果文件已经改变与否,无论运行。 最后我改变我的方法来检查,只用于GetLastAccessTime作为它的一部分。 不知道为什么它会表现不同生产服务器上....但我不是太关注这一点。



文章来源: .NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong