我试图获取特定目录中的文件列表,其中包含超过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是的。我试图创建一个列表,然后遍历它们并做一些处理。 –