2014-09-27 58 views
0

我的程序需要獲取所有子目錄和子文件的目錄大小,並通過遞歸枚舉該目錄中的所有對象並總結大小來實現。但是,大型目錄的性能是不可接受的。它比Windows資源管理器目錄的時間長,屬性會計算大小,並且會導致硬盤驅動器發出更多響聲。那麼,我該如何優化這個過程呢?有沒有適當的WinAPI函數或方法?有沒有更快的方法來獲取Windows中的目錄大小而不是遍歷所有子目錄?

+1

你如何做到這一點是屬性對話框,據我所知。文件系統會緩存目錄內容,因此如果先運行程序,則屬性對話框看起來要快得多,因爲數據已經存在內存中。 – 2014-09-27 21:56:55

+0

@JonathanPotter:我知道有一些緩存參與,並且我已經做了足夠多次的實驗來清楚地看到,即使Properties執行相同操作,它也是以更優化的方式執行的。我不確定如何優化它。 – 2014-09-27 21:59:20

+0

除了迭代之外沒有辦法做到這一點,所以你正在使用正確的方法來做到這一點。除非您的代碼存在問題,導致它比必要的慢,否則無法進一步優化。 – 2014-09-27 21:59:38

回答

2

對目錄中的文件進行迭代是唯一的通用方法,而且Windows在執行此操作時沒有任何捷徑(在使用用戶級權限運行的常規應用程序中 - 我不會建議您的應用只需要管理員權限即可運行!)。

如果目錄包含非常大量的文件,可能會有一些差異,具體取決於您是先深度優先還是廣度優先遞歸目錄 - 廣度優先需要將目錄「保存」到在當前目錄中搜索,如果你有很多目錄,這當然也會導致問題,其中深度優先方法不需要任何存儲,但意味着操作系統將有更多的目錄同時打開 - 並且可能會更多的頭部動作。然而,這可能非常微不足道。對於大型文件系統,「使用多少空間」可能會產生變化 - 我沒有真正嘗試過。

+0

我不同意這個觀點,即*「Windows肯定沒有做這個的捷徑」*。直接訪問[主文件表(MFT)](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365230.aspx)很可能比重複文件快得多**在一個目錄中。 – IInspectable 2014-09-30 07:10:12

+0

@IInspectable:但只有使用提升特權運行的應用程序才能做到這一點。我會修改「常規申請」。 – 2014-09-30 07:14:53

+0

@IInspectable:從我所能確定的情況來看,MFT包含了除文件所在目錄外的所有內容。這使得MFT方法僅適用於根目錄。 – MSalters 2014-09-30 07:32:42

相關問題