2008-10-31 101 views
3

看來C#中的Directory.GetFiles()修改了文件的上次訪問日期。 我已經搜索了幾個小時,似乎無法找到解決此問題的解決方案。無論如何保持文件的所有MAC(修改,訪問,創建)屬性?我使用Directory.GetDirectories(),Directory.GetFiles()和FileInfo。Directory.GetFiles保留上次訪問時間

此外,fi.LastAccessTime給出了奇怪的結果 - 日期是正確的,但是,時間是關閉了2分鐘,或幾個小時。

Time of function execution: 10/31/2008 8:35 AM 

Program Shows As    Last Access Time 
0_PDFIndex.html    - 10/31/2008 8:17:24 AM 
AdvancedArithmetic.pdf  - 10/31/2008 8:31:05 AM 
AdvancedControlStructures.pdf - 10/30/2008 1:18:00 PM 
AoAIX.pdf      - 10/30/2008 1:18:00 PM 
AoATOC.pdf     - 10/30/2008 12:29:51 PM 
AoATOC2.pdf     - 10/30/2008 1:18:00 PM 

Actual      Last Access Time 
0_PDFIndex.html    - 10/31/2008 8:17 AM 
AdvancedArithmetic.pdf  - 10/30/2008 12:29 PM 
AdvancedControlStructures.pdf - 10/30/2008 12:29 PM 
AoAIX.pdf      - 10/30/2008 12:29 PM 
AoATOC.pdf     - 10/30/2008 12:29 PM 
AoATOC2.pdf     - 10/30/2008 12:29 PM 

下面是我正在使用的方法。如果您需要更多信息,請告訴我。

謝謝!

public void PopulateTreeView(string directoryValue, ref TreeNode parentNode) 
     { 
      string[] directoryArray = Directory.GetDirectories(directoryValue); 
      string[] fileArray = Directory.GetFiles(directoryValue, "*.*", SearchOption.AllDirectories); 

      try 
      { 
       #region Directories 
       if (directoryArray.Length != 0) 
       { 
        foreach (string directory in directoryArray) 
        { 
         DirectoryInfo di = new DirectoryInfo(directory); 

         TreeNode dirNode = parentNode.Nodes.Add(di.Name); 

         FileNode fn = new FileNode(); 
         fn.bIsDir = true; 
         fn.dir = di; 

         dirNode.Tag = fn; 
         PopulateTreeView(directory, ref dirNode); 
         Application.DoEvents(); 

        } 
       } 
       #endregion 

       #region Files 
       if (fileArray.Length != 0) 
       { 
        foreach (string file in fileArray) 
        { 
         FileInfo fi = new FileInfo(file); 

         TreeNode fileNode = parentNode.Nodes.Add(fi.Name); 
         FileNode fn = new FileNode(); 
         fn.bIsDir = false; 
         fn.file = fi; 

         fileNode.Tag = fn; 

         fileNode.ImageIndex = 1; 

         Console.WriteLine(fi.Name + " - " + fi.LastAccessTime); 

        } 
       } 
       #endregion 

      } 
      catch (UnauthorizedAccessException) 
      { 
       parentNode.Nodes.Add("Access denied"); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
      finally 
      { 
       Application.DoEvents(); 
      } 
     } 

我知道屬性之間的差異。我需要的是該文件保持完全相同的所有屬性和元數據,就像我的程序從未觸及過該文件一樣;這包括上次訪問日期。

回答

5

我知道這是很不理想,但你可以使用FSUTIL(提供與Windows)來禁用上次訪問時間寫作:

fsutil behavior set disablelastaccess 1 

想必你會設置回0做一次。您可以使用C#中的Process.Start調用此方法,但必須有更好的編程方式(調用Windows API)。

Process.Start("fsutil", "behavior set disablelastaccess 1").WaitForExit(); 

請注意,這是一個全球性的Windows設置,也將影響您的應用程序之外的磁盤訪問...

+1

FSUTIL文檔指出:「大多數這些選項需要重新啓動才能生效。」 – GalacticCowboy 2008-10-31 14:35:11

1

訪問時間是從最後一次寫入時間不同。如果你使用fi.LastWriteTime,我想你會發現時間在瀏覽器或cmd窗口中顯示的是相同的。

當然,上次訪問和上次寫入可能是相同的,但它們不一定相同。

0

不知道這一點,但是從MSDN相關或不相關:

當第一次調用,FileSystemInfo 調用刷新和返回上的API緩存 信息來獲得屬性 等。在後續通話中,您必須撥打電話 以獲取最新的 信息副本。

順便說一句,「LastAccessTime」基本上告訴你最後一次「看着」文件。如果沒有陳舊的數據,這將永遠是「現在」...不是特別有用,恕我直言。

0

訪問時間將顯示只讀標記,最後寫入將顯示正在修改的文件。

1

(轉貼此作爲,而不是評論的迴應...)

我剛剛運行這段代碼片段在這裏,它剩下的最後訪問時間獨自 - 我無法重現你的問題看到了,所以Directory.GetFiles不會被100%的時間破壞。

的Filemon可以檢查一些其他的應用程序是否是這樣做的:http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx

0

我沒有嘗試這樣做,但谷歌表明:

Disable the NTFS Last Access Time Stamp

這是一個全系統的變化,所以要注意那...

+0

這可能是FSUTIL(由dbkk建議)所做的。 – GalacticCowboy 2008-10-31 14:33:37

+0

是的,它修改了相同的註冊表項。有沒有辦法做到這一點,而無需重新啓動? – 2008-10-31 15:39:31

0

如果你正在訪問磁盤的法醫目的,那麼你真的應該這樣做,整個硬盤寫保護在硬件級別(因此這不是一個真正的編程問題N)。

谷歌搜索hdd "write protect"將揭示大量的潛在解決方案。

1

如果您正在進行取證,並且您不希望修改驅動器,爲什麼要將它安裝在可寫模式下?您應該以只讀方式訪問它,以確保您不會意外更改某些內容。另外,我希望你沒有在你正在檢查的磁盤的操作系統上運行你的程序......你剛剛把磁盤加到了你控制的機器上,對吧?