我試圖獲取特定目錄中的文件列表,其中包含超過2000萬個文件,每個文件的範圍從2到20 KB。
問題是我的程序每次都會拋出內存異常,而像robocopy這樣的工具正在很好地將文件夾複製到另一個目錄,而完全沒有問題。這裏是我用來枚舉文件的代碼:在C#中的目錄中列出大量文件
List<string> files = new List<string>(Directory.EnumerateFiles(searchDir));
我應該怎麼做才能解決這個問題? 任何幫助,將不勝感激。
我試圖獲取特定目錄中的文件列表,其中包含超過2000萬個文件,每個文件的範圍從2到20 KB。
問題是我的程序每次都會拋出內存異常,而像robocopy這樣的工具正在很好地將文件夾複製到另一個目錄,而完全沒有問題。這裏是我用來枚舉文件的代碼:在C#中的目錄中列出大量文件
List<string> files = new List<string>(Directory.EnumerateFiles(searchDir));
我應該怎麼做才能解決這個問題? 任何幫助,將不勝感激。
您正在內存中創建一個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可以更高效。
不要創建文件列表。只需遍歷'EnumerateFiles'的結果並做任何你想做的事情。 – juharr
你是否試圖在內存中保存那麼多數據?在你可以做的方式是創建子目錄並將其分成組。 – Rohit
@Rohit是的。我試圖創建一個列表,然後遍歷它們並做一些處理。 –