2011-08-27 130 views
1

我有一個基本上像Windows資源管理器一樣工作的C#程序的想法。目的是顯示所有文件和文件夾,並顯示每個文件和文件夾的具體信息。我正在計劃的功能之一是檢測資源管理器無法訪問的文件夾大小。計算和緩存文件夾大小

我對算法的想法是累積特定文件夾中所有文件的大小。但是,我擔心性能問題。例如,要顯示C的所有文件夾的大小:我必須考慮整個驅動器上的所有文件。這可能需要一段時間,因此每次用戶切換到不同的文件夾或返回時都無法完成計算。

所以我想緩存一些大小。但是,當文件更改,添加或刪除時,緩存數據將變得過時。但是我不想在程序沒有運行的時候監視所有的文件變化。

有什麼方法可以找出緩存是否是最新的,例如:通過檢索某種不需要再次計算所有大小的校驗和?是否有另一種內存和CPU高效的方法來查明自上次計算以來文件大小是否發生了變化?或者還有另一種可能性?

+1

你見過TreeSize了嗎? http://download.cnet.com/TreeSize-Free/3000-2248_4-11653027.html – David

+0

@大衛不,直到現在我還沒有看到它。我知道有幾個程序可以做到,但我想自己寫一些這樣的工具。 :) – RolandK

回答

1

Windows資源管理器具有可用的文件夾大小(#個文件,磁盤大小等)可用於任何磁盤/文件夾的屬性。 Directory Properties Example

至於編寫程序,您當然可以使用recruve DirectoryInfo.EnumerateFiles()來獲取磁盤/文件夾中的所有文件。

至於監控,您可以使用FileSystemWatcher類來監控對任何磁盤/文件夾的更改。

爲了保持高速緩存最新的將是困難的,因爲:

  1. 根據不同的分區格式化類型[FAT,FAT32,NTFS等]您被限制爲每個支持什麼。
  2. 任何新文件(創建日期>緩存日期)意味着您仍然必須枚舉所有文件以將列表篩選爲新文件。
  3. 修改後的文件(修改日期>緩存日期)具有相同的問題。

除非您對C#提供的格式化類型非常特別,否則在每次啓動應用程序時都需要更新緩存,而且會非常激烈。

+0

感謝您的答案,但獲取文件夾的文件不是問題。監視大小可能無濟於事,因爲程序不運行時它們可能會更改。 – RolandK

+0

我會更新我的答案。 –

+1

對於NTFS,如果您可以找到使用它的方法是http://en.wikipedia.org/wiki/NTFS#USN_Journal,那麼您的緩存只需要查看日記內的更改。 –

1

Windows資源管理器是一個非常狡猾的程序。它充滿了旨在隱藏任何文件系統懲罰緩慢迭代的事實的技巧。我知道的那種技巧:

  • 假的吧。將文件夾層次結構顯示爲樹形視圖,並使用[+] 字形顯示文件夾中包含文件或目錄。 即使它沒有。這是可見的,創建一個空目錄並重新啓動您的機器。注意[+]字形,點擊它並注意, 當被迫迭代子目錄時,它會平滑地將[+] 字形更改爲'Nothing there'字形。

  • 延遲它。很難看到,你需要一個有很多 文件的子目錄。資源管理器啓動後臺線程,該後臺線程迭代文件夾的內容 。一旦找出它,它會平滑地更改狀態欄文本 。

  • 告訴我發生了什麼事。 Explorer嚴重使用ReadDirectoryChangesW() 。由FileSystemWatcher類包裝在.NET中。關鍵點 是它得到一個通知,東西在用戶正在查看的 子目錄中更改。不需要輪詢, 會有可怕的表現。回到第二項。