我目前有一個掃描網絡共享的程序。爲此,它首先枚舉共享上的所有文件和目錄。這是一個非常緩慢的過程。我目前使用下面的代碼,取自本網站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