在我的 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
答案1
问题可能是存在多个上次访问时间。确实如此。
微软文章 fsutil 行为 说:
一小时是 NTFS 可以延迟更新磁盘上的上次访问时间的最大时间。如果 NTFS 更新了其他文件属性(例如上次修改时间),并且上次访问时间更新处于待处理状态,则 NTFS 会将上次访问时间与其他更新一起更新,而不会对性能产生额外影响。
为了减少磁盘抖动,Windows 应该将上次访问时间在内存中保留一小时,然后再刷新到磁盘,以尽量减少磁盘 I/O。因此,您已经有两个访问时间,并且根据它们使用的 API,不同的工具可能会以不一致的方式报告这两个时间。
Msuhanov 在文章中探讨了最后访问的问题
最后访问时间戳的(不)一致性。
他的成绩并不令人鼓舞:
磁盘写入上次访问时间的时间可能比一小时长得多。在一个案例中,直到 12 小时后,当 Msuhanov 放弃并关闭计算机时,它才被写入。在此期间,程序可能会获取旧时间或新时间,具体取决于获取时间的方式/位置。
Msuhanov 还发现上次访问时间:一个位于文件记录中,另一个位于索引记录中 ($I30)。因此,根据访问 API 函数或修改 API 函数,人们将处理其中一个或另一个,但无法保证一致性。
所以现在我们有最后访问三次在 Windows 中!
我的结论是 Windows 中的上次访问时间实现过于繁琐且不可靠。我不知道这些时间戳中的哪一个用于dir
内存时间戳或磁盘时间戳。有可能dir
显示的是磁盘时间戳,而当 Windows 决定将内存时间戳写入磁盘时,该时间戳会发生变化。
我不建议依赖上次访问时间来确保正确性。它不是一个可靠的工具,而且它的实现很奇怪。