为什么文件属性中的“访问时间”和“修改时间”不一致?

在Win7下,我注意到一个现象,就是经常文件属性中的“访问时间”和“修改时间”是不一致的,如下图:

image

 

这个文件是我在21:41 创建的,然后我在21:42修理里面的内容并保存。按照常理,访问时间应该和修改时间一致才对。现象是反而比修改时间早,很奇怪。

根据GetFileTime这个API,和文件相关的时间有3个:

BOOL WINAPI GetFileTime(
  __in       HANDLE hFile,
  __out_opt  LPFILETIME lpCreationTime,
  __out_opt  LPFILETIME lpLastAccessTime,
  __out_opt  LPFILETIME lpLastWriteTime
);

CreationTime:创建时间,很好理解,就是这个文件创建时的时间。

LastAccessTime:最后访问时间,表示文件读取,写入,复制或者执行的最后时间.

LastWriteTime:  文件最后写入的时间。

从这个定义来看的话,LastAccessTime应该大于等于LastWriteTime.但是从使用来看的话,却又不是这样的。

 

Why?

今天看了The Old New Thing才明白过来,原来从2003 SP1起,为了性能,默认把LastAccessTime给禁用了

我使用的是Win7系统,默认是关闭的。

 

那么它为什么会影响性能呢?

LastAccessTime会保存到两个地方:

  • 文件属性中,作为MFT中的一条记录
  • 该文件所属的目录索引中。

 

影响性能的主要原因是如果一个文件只是读操作的话,为了更新这个时间,就必须做一个写操作,把该信息写入到文件属性和目录索引中去,这样一个读操作就变成了一个读+写操作。由于现在的硬盘都非常大,几十万个文件都是常事,如果读操作再加一个写操作,那么这个确实影响性能。(详细可以参考Fsutil: behavior 中对于DisableLastAccess的描述,地址附后)。

 

下面是各个文件系统对文件时间的支持文档:

Feature NTFS exFAT UDF FAT32
Creation time stamps(创建时间) Yes Yes Yes Yes
Last access time stamps(最后访问时间) No* Yes Yes Yes (只更新日期)
Last change time stamps(最后改变时间) Yes Yes Yes Yes
Last archive time stamps(最后存档时间) No No No No

说明:

1.NTFS 本身是支持更新LastAccessTime,在Windows 2000,XP,2003中默认是开启的,Vista之后需要单独开启。

 

如何开启LastAccessTime的更新呢?

使用命令查询当前系统是否关闭了LastAccessTime的更新:

fsutil behavior query disablelastaccess

image

1 表示关闭,0表示开启

 

关闭LastAccessTime的更新:

fsutil behavior set disablelastaccess 1

image

注意:需要重启。

 

打开LastAccessTime的更新:

fsutil behavior set disablelastaccess 0

image

注意:需要重启。

 

事实上,上面的修改都是修改的注册表

Key: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
Value Name: NtfsDisableLastAccessUpdate
Data Type: REG_DWORD (DWORD Value)
Value Data: (0 = disable, 1 = enable)

image

 

参考资料

FILE_BASIC_INFO Structure

http://msdn.microsoft.com/zh-cn/library/aa364217(VS.85).aspx

SetFileTime Function

http://msdn.microsoft.com/en-us/library/ms724933(VS.85).aspx

GetFileTime Function

http://msdn.microsoft.com/en-us/library/ms724320(v=VS.85).aspx

File System Functionality Comparison

http://msdn.microsoft.com/en-us/library/ee681827(VS.85).aspx

What's the difference between LastWriteTime and ChangeTime in FILE_BASIC_INFO?

http://blogs.msdn.com/b/oldnewthing/archive/2010/07/09/10036162.aspx

Disabling Last Access Time in Windows Vista to improve NTFS performance

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

Enable Last Access Time Stamp To Files In Windows 7 [How-To]

http://www.groovypost.com/howto/microsoft/enable-last-access-time-stamp-to-files-folder-windows-7/

KB894372:Support for Windows Server 2003 SP1 on Windows Storage Server 2003-based server appliances

http://support.microsoft.com/?scid=kb;en-us;894372&x=9&y=15

NtfsDisableLastAccessUpdate

http://technet.microsoft.com/en-us/library/cc758569(WS.10).aspx

Fsutil: behavior

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fsutil_behavior.mspx?mfr=true

posted @   林杰的博客  阅读(33259)  评论(23编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示