在C#目录中列出大量文件

Jer*_* Mc 1 c# directory enumeration file

我正在尝试获取特定目录中的文件列表,该目录包含超过2000万个文件,每个文件的大小为2到20 KB。
问题是我的程序每次都会抛出“内存不足”异常,而诸如robocopy之类的工具可以很好地将文件夹复制到另一个目录中,而没有任何问题。这是我用来枚举文件的代码:

            List<string> files = new List<string>(Directory.EnumerateFiles(searchDir));
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?任何帮助,将不胜感激。

Hab*_*bib 5

您正在创建一个内存为2000万个对象的列表。我认为即使有可能,您也不会使用它。

而是使用Directory.EnumerateFiles(searchDir)逐个迭代每个项目。

喜欢:

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

使用当前代码,您的程序将首先在内存中加载2000万个对象,然后您必须对其进行迭代或执行操作。

请参阅:Directory.EnumerateFiles方法(字符串)

EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,可以在开始返回整个集合之前开始枚举名称集合;否则,您可以开始枚举名称集合。使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles可能会更有效。

  • @GillBates,不。枚举,并不意味着返回集合。这将做懒惰的评估。就像`File.ReadLine`与`File.ReadAllLines`一样。 (3认同)
  • @ rory.ap,不是的。这不会加载内存中的2000万个文件路径,而是一次成为一个对象*(字符串路径)* (2认同)