原帖地址 http://www.xueit.com/html/2010-07/44-4818641862010712104126890.html
注:wp7的文件系统同样适应,即wp7中的IsolatedStorageFile.GetUserStoreForApplication().GetLastAccessTime(FileName)是无用的,总是等于GetCreationTime
本文和大家讲下为什么在windows7系统下出现文件访问时间与修改时间不一致的原因。
如下图:

这个文件是我在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

1 表示关闭,0表示开启
关闭LastAccessTime的更新:
fsutil behavior set disablelastaccess 1

注意:需要重启。
打开LastAccessTime的更新:
fsutil behavior set disablelastaccess 0

注意:需要重启。
事实上,上面的修改都是修改的注册表
Key: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
Value Name: NtfsDisableLastAccessUpdate
Data Type: REG_DWORD (DWORD Value)
Value Data: (0 = disable, 1 = enable)
