我有一个程序可以节省大约300万个目录并读取或写入它们但是当我想用Directory.GetDirectories(SourcEDirectorY.Text, "*", SearchOption.AllDirectories)
保存它时它就没有响应。
我该怎么做才能解决这个问题?
答案 0 :(得分:5)
而不是Directory.GetDirectories
,请致电Directory.EnumerateDirectories。
有什么区别? EnumerateDirectories
返回IEnumerable<string>
,而GetDirectories
返回字符串数组:string[]
。
所以,如果你这样做:
foreach (var dir in Directory.GetDirectories(...))
{
}
然后您最终会等待,直到从磁盘读取整个目录条目数组。与EnumerateDirectories
对比:
foreach (var dir in Directory.EnumerateDirectories(...))
{
}
立即返回第一个目录,您可以对其进行处理。每次循环时,都会返回另一个目录名。因此,不是在前面构建整个阵列,而是大致永久地建立整个阵列,而是在找到目录时一次获得一个目录。
这最终会提高内存效率,因为它不需要构建大量的目录条目。更重要的是,显示更快,因为您立即开始获得结果。它实际上是更快还是更慢是一个开放的问题,取决于许多不同的事情。如果它的速度不同,它可能只有一点点的方式。如果你正在做三百万个目录的重要事情,那当然不够重要。