轉http://greenerycn.cnblogs.com/
在Win7下,我注意到一個現象,就是經常文件屬性中的“訪問時間”和“修改時間”是不一致的,如下圖:
這個文件是我在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)
用python獲取的方法為:
我們通過文件屬性的獲取,os.stat() 方法:
>>> import os
>>> statinfo=os.stat(r"C:/1.txt")
>>> statinfo
(33206, 0L, 0, 0, 0, 0, 29L, 1201865413, 1201867904, 1201865413)
使用os.stat的返回值statinfo的三個屬性獲取文件的創建時間等
st_atime (訪問時間), st_mtime (修改時間), st_ctime(創建時間),例如,取得文件修改時間:
>>> statinfo.st_mtime
1201865413.8952832
這個時間是一個linux時間戳,需要轉換一下
使用time模塊中的localtime函數可以知道:
>>> import time
>>> time.localtime(statinfo.st_ctime)
(2008, 2, 1, 19, 30, 13, 4, 32, 0)
2008年2月1日的19時30分13秒(2008-2-1 19:30:13)