【发布时间】:2014-11-15 02:43:07
【问题描述】:
我目前有一个扫描网络共享的程序。为此,它首先枚举共享上的所有文件和目录。这是一个非常缓慢的过程。我目前使用以下代码,取自本网站 2011 年的回答。
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使用适当的重载不是更容易吗? -
如果您无权访问文件/目录,Directory.EnumerateFiles 会引发错误。如果这样做,它只会返回到目前为止发现的内容,可能是 70GB 中的 3MB。 :-(
-
那么我想你唯一的选择是下面链接的快速目录枚举器。在 C# 中反复捕获异常和递归方法将比直接枚举慢...
-
您对该网络共享拥有何种访问权限?你能在那个盒子上远程运行代码吗?或者它只是普通的普通网络共享,只有读取和写入文件的权限有限?
-
@VikasGupta 我无权在服务器上运行代码。我对共享中包含的大约 98% 的文件具有读/写访问权限。某些目录是禁止访问的,即使对我来说也是如此。
标签: c# .net multithreading optimization