在我的 Windows 11 22H2 系统上,我已验证上次访问时间戳是否得到维护 ( fsutil behavior query disableLastAccess
),并且可以在 PowerShell 中检索它们。
然而,使用cmd.exe
的dir
命令,即按文件的上次访问时间/ta
显示文件,在情况上似乎与 的行为相同,即按文件的上次写入时间显示文件。/tw
这种情况仅有时发生:
某些文件会发生这种情况,但它们似乎没有什么特别的(仅具有
A
属性集的文本文件)。当这种情况发生时,文件资源管理器也会显示上次写入时间戳(但 PowerShell 始终显示正确的时间戳。
我无法可靠地重现这一点:下面的 PowerShell 测试代码按预期工作。
这与缓存时间戳有关吗?但是,如果是这样,为什么 PowerShell 能够检索它们?对于受影响的文件,即使几个小时后问题仍然存在。
PowerShell 测试代码,未表现出该症状。
# Create a test file.
1 > _test.txt
# Assign distinctive timestamps.
(Get-Item _test.txt).LastWriteTime = '1970-01-01'
(Get-Item _test.txt).LastAccessTime = '1970-01-01'
# Read the file, so as to update its last-access timestamp.
$null = Get-Content _test.txt
# List the file with its last-access timestamp.
cmd /c dir _test.txt /ta
# Do the same in PowerShell
Get-Item _test.txt | Select-Object Name, LastAccessTime
问题可能是有多个上次访问时间。真的。
微软文章 fsutil 行为 说:
为了减少磁盘抖动,Windows 应该将上次访问时间在内存中保留一小时,然后再刷新到磁盘,以最大限度地减少磁盘 I/O。因此,您已经有两个访问时间,并且根据它们使用的 API,不同的工具可能会以不一致的方式报告任一时间。
Msuhanov 在文章《上次
访问时间戳的(不)一致性》中研究了上次访问的问题。
他的结果并不令人鼓舞:
上次访问时间的磁盘写入可能会在比一小时长得多的时间之后发生。在其中一个案例中,12 小时后,姆苏哈诺夫放弃并关闭了电脑,才将其写出。在此期间,程序可能会获取旧时间或新时间,具体取决于获取时间的方式/地点。
Msuhanov 还发现有两个上次访问时间:一个在文件记录中,另一个在索引记录中($I30)。因此,根据访问 API 函数或修改 API 函数,我们将处理其中之一,而无法保证一致性。
所以现在我们在 Windows 中有3 个最后访问时间!
我的结论是 Windows 中的上次访问时间实现非常挑剔且不可靠。我不知道这些时间戳中使用的是
dir
内存时间戳还是磁盘时间戳。可能会dir
显示磁盘一,当 Windows 决定将内存一写入磁盘时,情况会发生变化。我不建议依赖上次访问时间来确保其正确性。它不是一个可靠的工具,而且它的实现很奇怪。