我的程序需要獲取所有子目錄和子文件的目錄大小,並通過遞歸枚舉該目錄中的所有對象並總結大小來實現。但是,大型目錄的性能是不可接受的。它比Windows資源管理器目錄的時間長,屬性會計算大小,並且會導致硬盤驅動器發出更多響聲。那麼,我該如何優化這個過程呢?有沒有適當的WinAPI函數或方法?有沒有更快的方法來獲取Windows中的目錄大小而不是遍歷所有子目錄?
回答
對目錄中的文件進行迭代是唯一的通用方法,而且Windows在執行此操作時沒有任何捷徑(在使用用戶級權限運行的常規應用程序中 - 我不會建議您的應用只需要管理員權限即可運行!)。
如果目錄包含非常大量的文件,可能會有一些差異,具體取決於您是先深度優先還是廣度優先遞歸目錄 - 廣度優先需要將目錄「保存」到在當前目錄中搜索,如果你有很多目錄,這當然也會導致問題,其中深度優先方法不需要任何存儲,但意味着操作系統將有更多的目錄同時打開 - 並且可能會更多的頭部動作。然而,這可能非常微不足道。對於大型文件系統,「使用多少空間」可能會產生變化 - 我沒有真正嘗試過。
我不同意這個觀點,即*「Windows肯定沒有做這個的捷徑」*。直接訪問[主文件表(MFT)](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365230.aspx)很可能比重複文件快得多**在一個目錄中。 – IInspectable 2014-09-30 07:10:12
@IInspectable:但只有使用提升特權運行的應用程序才能做到這一點。我會修改「常規申請」。 – 2014-09-30 07:14:53
@IInspectable:從我所能確定的情況來看,MFT包含了除文件所在目錄外的所有內容。這使得MFT方法僅適用於根目錄。 – MSalters 2014-09-30 07:32:42
- 1. 如何遍歷目錄和子目錄中的所有文件
- 2. 如何在Windows 7上獲取目錄中所有文件(包括所有子目錄)的大小?
- 3. groovy從遍歷所有子目錄時排除.svn目錄
- 4. 獲取目錄和子目錄中的所有.gz文件的大小 - python
- 5. 遍歷根目錄並獲取其中的所有文件?
- 6. Java不會遍歷大目錄中的所有文件
- 7. 從目錄和子目錄中獲取所有文件,大小,路徑php
- 8. 如何遍歷並獲取SQL Server目錄中的子目錄?
- 9. JAVA - 獲取所有子目錄的大小?
- 10. 有更快的方法來製作多個子目錄嗎?
- 11. 遞歸遍歷目錄及其子目錄中的所有文件Qt
- 12. CMake:如何獲取目錄中所有子目錄的名稱?
- 13. 如何遞歸遍歷所有子目錄並讀取文件?
- 14. 遍歷子目錄中的所有媒體文件
- 15. 是否有更快的方法來獲取並輸出目錄樹中的所有文件名?
- 16. Linux命令從所有目錄和子目錄中獲取文件的所有文件,大小和路徑
- 17. 如何遍歷目錄中的所有文件;如果它有子目錄,我想遍歷子目錄中的文件
- 18. 有沒有更快的方法遍歷Java中BufferedImage的像素?
- 19. SharpSVN不遍歷所有子目錄和文件
- 20. Bash:scp目錄中的所有文件,但不是子目錄
- 21. 通配符來獲取所有目錄
- 22. 如何遍歷一個目錄,而不進入子目錄
- 23. C++:獲取的所有文件的大小當前目錄
- 24. 有沒有更快的方法來遍歷Sqlite查詢中的行?
- 25. 獲取目錄中的所有文件和所有文件的所有子目錄下
- 26. 嘗試遍歷本地目錄中沒有「。」的所有文件。和「..」
- 27. php獲取所有子目錄和所有文件的列表
- 28. 列出目錄+子目錄中的所有文件和目錄
- 29. 有沒有什麼方法可以知道目錄是否包含子目錄?
- 30. 有沒有更快的方法來統計加入的記錄
你如何做到這一點是屬性對話框,據我所知。文件系統會緩存目錄內容,因此如果先運行程序,則屬性對話框看起來要快得多,因爲數據已經存在內存中。 – 2014-09-27 21:56:55
@JonathanPotter:我知道有一些緩存參與,並且我已經做了足夠多次的實驗來清楚地看到,即使Properties執行相同操作,它也是以更優化的方式執行的。我不確定如何優化它。 – 2014-09-27 21:59:20
除了迭代之外沒有辦法做到這一點,所以你正在使用正確的方法來做到這一點。除非您的代碼存在問題,導致它比必要的慢,否則無法進一步優化。 – 2014-09-27 21:59:38