2010-08-27 61 views
6

我有大量的目錄,我想盡可能快地讀取所有文件。我的意思是,不是DirectoryInfo.GetFiles快,而是'get-clusters-from-disk-low-level'快。* FASTEST *目錄列表

當然,.NET 2.0,C#

類似的問題在這裏,但這種做法是沒有任何好處的:

C# Directory listing massive directory

有人建議的PInvoke上的FindFirst/FindNext中。任何人都試過並能夠分享結果?

+0

使用反射器,它看起來像DirectoryInfo.GetFiles最終反正歸結爲用FindFirstFile/FindNextFile KERNEL32呼叫。 – 2010-08-27 09:36:31

回答

5

對於一個「正常」的方法,基本上所有的東西都歸結爲FindFirstFile/FindNextFile,你並沒有真的比這更快......而且這不是超級快速。

如果你真的需要速度,考慮人工讀取MFT - 但要知道,這需要管理員權限,而且很容易打破NTFS時被更新(以及,噢,不會對非NTFS工作文件系統)。你可能想看看this code其中有USN和MFT的東西。

但是,也許有不同的解決方案。如果您的應用程序不斷運行並需要更改,那麼可以通過執行一個緩慢的FindFirstFile/FindNextFile通行證開始,然後使用目錄更改通知支持來通知更新......這適用於有限用戶,並且不適用於「 t取決於文件系統結構。

1

嘗試使用類似this DirectoryManager的東西,並根據您的需求進行優化。因爲我們在那裏省略了跨平臺檢查和修改,因此運行速度比.NET Framework GetDirectories()GetFiles()快。

+2

非常漂亮的小班,它使用'FindFirstFile/FindNextFile'。就我個人而言,我會在這裏添加代碼的副本,而不是鏈接到其他網站,以防萬一發生故障。 – Thymine 2012-03-22 22:22:01

+5

@Eugene Cheverda DirectoryManager鏈接不再有效:P – 2014-02-04 23:32:19

3

爲了獲得最佳性能,可以P/Invoke NtQueryDirectoryFile,記錄爲ZwQueryDirectoryFile。

(直接訪問磁盤和直接讀取原始文件系統結構,這通常是不實際的這短。)