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