windows 尽管目录中的文件发生了更改,“Directory.GetLastWriteTime()”方法返回相同的日期/时间

9q78igpj  于 6个月前  发布在  Windows
关注(0)|答案(2)|浏览(62)

在使用File.GetLastWriteTime()方法获取指定目录的最后写入日期和时间时,我观察到一个奇怪的问题。
下面是一个例子:

// ‘path’ is directory for which need to obtain modification date/time information.
DateTime dtp = File.GetLastWriteTime(path);
DateTime dtf = File.GetLastWriteTime(path+@"\log.txt");

Console.WriteLine($"{path}, dir: {dtp:hh:mm:ss.fff}, file: {dtf:hh:mm:ss.fff}");

字符串
现在,当我更新log.txt文件时,例如,

echo some-text >> "log.txt"


在命令提示符下,dtf被未更改的dtp更新。
指定的目录日期和时间仅在我创建文件或删除目录中的某些文件时更改。
有人能帮我理解我错过了什么吗?

  • 注:*

1.使用Directory.GetLastWriteTime()方法时也会发生同样的情况。
1.使用Windows 10。
1.操作系统没有任何注册表修复应用如本文所述:File.GetLastWriteTime seems to be returning 'out of date' value

z4bn682m

z4bn682m1#

在某些评论中提到的LastAccessTimeLastWriteTime无关。
对于LastAccessTime,无法保证它是否被实现,多久更新一次,以及它的准确性如何。
然而,LastWriteTime有很多保证,至少在本地的NTFS文件系统上是这样的;如果它不能正确工作,那么很多其他的东西都不能工作,包括我们已经非常熟悉的一个:Building.(只重新编译那些自上次构建以来发生了变化的源文件,这只是几秒钟前发生的)。
这里发生的事情是windows(或者更准确地说是windows)延迟更新文件的LastWriteTime,直到该文件关闭。所以,只要你保持文件打开,LastWriteTime可能是不准确的,但是一旦你关闭该文件,它就会被更新。
本质上,您可以将LastWriteTime视为LastCloseTime,或者更准确地说,LastCloseTimeAfterOpenedForWriting
在问题中,您说您通过执行以下操作来更新log.txt文件,例如:

echo some-text >> "log.txt"

字符串
从概念上讲,这将打开"log.txt"进行追加,将some-text写入其中,然后关闭它。但我说的是概念上的。如果这实际上发生了,那么您的LastWriteTime将正确更新,但它没有。
这里可能发生的情况是,命令处理器正在应用一些优化,其中log.txt>>操作符的多次调用中保持打开。我不确定这一点,我只是假设它。
我不知道你到底在做什么,你是如何做到这一点,但你的问题的解决方案很可能涉及以某种方式确保您的文件已被关闭,然后再尝试查询其LastWriteTime
也许可以尝试通过命令处理器的嵌套示例将所有的附加操作都添加到文件中?不过请注意,命令处理器也可能对此进行优化,因此如果它不起作用,您可能不得不继续尝试其他可能的解决方案。

avkwfej4

avkwfej42#

我在doc中找到的一个解释是:

This method may return an inaccurate value, because it uses native functions whose 
values may not be continuously updated by the operating system.

字符串
我认为这很有挑战性,因为文件或目录实际上可能是虚拟的,也可能是符号链接(在Linux中)。

相关问题