2016-09-28 67 views
0

我試圖獲取特定目錄中的文件列表,其中包含超過2000萬個文件,每個文件的範圍從2到20 KB。
問題是我的程序每次都會拋出內存異常,而像robocopy這樣的工具正在很好地將文件夾複製到另一個目錄,而完全沒有問題。這裏是我用來枚舉文件的代碼:在C#中的目錄中列出大量文件

  List<string> files = new List<string>(Directory.EnumerateFiles(searchDir)); 

我應該怎麼做才能解決這個問題? 任何幫助,將不勝感激。

+0

不要創建文件列表。只需遍歷'EnumerateFiles'的結果並做任何你想做的事情。 – juharr

+0

你是否試圖在內存中保存那麼多數據?在你可以做的方式是創建子目錄並將其分成組。 – Rohit

+0

@Rohit是的。我試圖創建一個列表,然後遍歷它們並做一些處理。 –

回答

2

您正在內存中創建一個2000萬個對象的列表。即使可能,我也不認爲你會使用它。

取而代之的是使用Directory.EnumerateFiles(searchDir)並逐一重複每個項目。

,如:

foreach(var file in Directory.EnumerateFiles(searchDir)) 
{ 
    //Copy to other location, or other stuff 
} 

以您目前的代碼,你的程序將有20個億個對象先加載到內存中了,然後你必須迭代,或對它們進行操作。

參見:Directory.EnumerateFiles Method (String)

的EnumerateFiles和GetFiles的方法的區別如下:當您使用 EnumerateFiles,你將返回整個集合之前可以開始列舉的 名稱的集合;當您使用 GetFiles時,您必須等待返回 之前可以訪問該數組的所有名稱數組。因此,當您使用 許多文件和目錄時,EnumerateFiles可以更高效。

+0

是不是會遇到同樣的問題? –

+2

@ rory.ap,不會。這不會加載內存中的2000萬個文件路徑,相反,它將是一個對象*(字符串路徑)*在內存中一次 – Habib

+3

@GillBates,no。枚舉,並不意味着返回集合。這會做懶惰評估。就像'File.ReadLine'和'File.ReadAllLines'一樣。 – Habib