為什么文件屬性中的“訪問時間”和“修改時間”不一致?


轉http://greenerycn.cnblogs.com/

在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

 

用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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM