我目前有一个扫描网络共享的程序。为此,它首先枚举共享上的所有文件和目录。这是一个非常缓慢的过程。我目前使用下面的代码,取自本网站2011年的答案。通过网络优化Dictionary.EnumerateFiles
static class SafeWalk
{
public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
{
try
{
var dirFiles = Enumerable.Empty<string>();
if (searchOpt == SearchOption.AllDirectories)
{
dirFiles = Directory.EnumerateDirectories(path)
.SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
}
return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine(ex.Message);
return Enumerable.Empty<string>();
}
}
}
问题是程序中的其他所有内容都是多线程的,并且针对速度进行了优化。这是唯一严重阻碍我的领域。枚举网络共享中的文件可能需要几分钟的时间。这是在Intranet上,并且我的机器和服务器之间有千兆位连接或更大的连接。
当我在运行时临时将网络路径映射到驱动器时,我确实加快了速度。有什么我可以做得更快?看资源监视器,它几乎不使用任何CPU,内存或网络带宽。
而不是创建一个递归方法,对于['Directory.EnumerateFiles'](http://msdn.microsoft.com/en-us/library/dd383571%28v)使用适当的重载不会更容易= vs.110%29.aspx)? – 2014-11-14 16:33:37
如果您无权访问文件/目录,Directory.EnumerateFiles将引发错误。如果这样做,它只会返回迄今为止发现的内容,可能是70GB中的3MB。 :-( – 2014-11-14 16:37:21
然后我猜你唯一的选择就是下面链接的快速目录枚举器。在C#中反复捕获异常和递归方法将比直接枚举慢,但... – 2014-11-14 16:43:14