2011-06-13 63 views
11

MSDN documentation對於FileInfo.Name屬性,我發現該屬性的數據在第一次被調用時被緩存,並且僅在隨後通過使用Refresh方法進行更新。在C#中緩存FileInfo屬性

我有,我無法找到或不是太清晰的文檔中的以下問題:

  1. 是對在同一時間緩存的所有屬性數據?

  2. 正所謂上創建FileInfoRefresh方法,或者只有當一個屬性被稱爲是第一次?

  3. 如果我調用了一個屬性,例如Name財產,並且它被稱爲Refresh,將調用不同的財產,例如, DirectoryName屬性,第一次導致它再次調用Refresh,或者它只被整個類中訪問的第一個屬性調用(請參閱問題#1)?

  4. 我可以通過手動調用Refresh預先緩存所有屬性嗎? (假設在構建物體時沒有預緩存)

  5. 是否手動調用Refresh會導致屬性爲pre-cached,例如, CreationTime,以及更新?

+2

我建議你下載ILSpy http://wiki.sharpdevelop.net/ILSpy.ashx和檢查FileInfo的實現。這是獲得BCL類型內部詳細問題答案的最佳方式。 – bentayloruk 2011-06-13 19:22:29

+0

我同意。同樣值得注意的是,現在(就像今天這樣),您可以在線瀏覽參考源。這是[FileInfo的定義](http://referencesource.microsoft.com/#mscorlib/system/io/fileinfo.cs,4ee673c1a4ecad41),它的所有榮耀。 – 2016-03-07 09:32:41

回答

4
  1. 在猜測,是的。對於FileInfo來說,這看起來像是一種自我毀滅的「優化」,它只能提取之前提取的屬性,特別是當它們可以(也可能是)全部取自one API call時。

  2. ,該文件調出DirectoryInfo方法,其服務的時候已經緩存FileInfo小號表明相當強烈(對我來說,反正)的事實,只是構建一個FileInfo不緩存任何東西。它是有道理的 - 如果你直接構建一個FileInfo,它可能引用一個還不存在的文件(例如你打算創建它),而所有返回緩存的方法都是指存在於快照的時間,假設你至少要使用其中一些

  3. 不,我對問題1的回答。這就是爲什麼Refresh方法在那裏。

  4. 我會想象如此(見答案1)。

  5. 是的。見答案3。

2

的CREATIONTIME屬性的值是預先高速緩存如果FileSystemInfo對象的當前 實例是從任何的 以下DirectoryInfo的方法返回:

  • GetDirectories
  • 的GetFiles
  • GetFileSystemInfos
  • EnumerateDirectories
  • EnumerateFiles
  • EnumerateFileSystemInfos

要獲取最新的值,調用Refresh方法。

如果FileSystemInfo對象所描述的文件不存在, 此屬性將返回午夜12點,1601年1月1日公元(CE值) 協調世界時(UTC),調整爲本地時間。

NTFS格式的驅動器可能會在短時間內緩存文件元信息,例如文件創建時間 。這個過程被稱爲文件 隧道。因此,如果覆蓋或替換現有文件,則可能需要明確設置文件的創建時間 。

MSDN

在內部,Refresh調用標準的Win32API從而填充所有屬性。

[...] 
flag2 = Win32Native.GetFileAttributesEx(path, 0, ref data); 

訪問被指定刷新任何屬性會導致完全刷新,例如:

public DateTime LastAccessTimeUtc 
{ 
    [SecuritySafeCritical] 
    get 
    { 
     if (this._dataInitialised == -1) 
     { 
      this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA); 
      this.Refresh(); 
     } 
     [...]