.NET 4.0 中有一个很好的新方法,可以通过枚举以流式方式获取目录中的文件。
这里的问题是,如果希望枚举所有文件,则可能无法提前知道哪些文件或文件夹受到访问保护,并且可能会抛出 UnauthorizedAccessException。
要重现,只需运行此片段即可:
foreach (var file in Directory.EnumerateFiles(@"c:\", "*", SearchOption.AllDirectories))
{
// whatever
}
在此 .NET 方法存在之前,可以通过在字符串数组返回方法上实现递归迭代器来实现大致相同的效果。但它并不像新的 .NET 方法那么懒惰。
那该怎么办呢?使用此方法时,UnauthorizedAccessException 可以被抑制吗?还是确实存在?
在我看来,该方法应该有一个重载,接受一个操作来处理任何异常。
最佳答案
我无法使上述工作正常,但这是我的实现,我在“Win7”机器上的 c:\users 上测试了它,因为如果有所有这些“讨厌的”目录:
SafeWalk.EnumerateFiles(@"C:\users", "*.jpg", SearchOption.AllDirectories).Take(10)
类(class):
public 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)
{
return Enumerable.Empty<string>();
}
}
}
关于.net - Directory.EnumerateFiles => UnauthorizedAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098011/