2016-09-28 66 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