【发布时间】:2011-07-03 03:37:44
【问题描述】:
.NET 4.0 中有一个很好的新方法,可以通过枚举以流的方式获取目录中的文件。
这里的问题是,如果希望枚举所有文件,可能事先不知道哪些文件或文件夹受到访问保护,并可能引发 UnauthorizedAccessException。
要重现,只需运行这个片段:
foreach (var file in Directory.EnumerateFiles(@"c:\", "*", SearchOption.AllDirectories))
{
// whatever
}
在此 .NET 方法存在之前,可以通过在字符串数组返回方法上实现递归迭代器来实现大致相同的效果。但它并不像新的 .NET 方法那么懒惰。
那该怎么办?使用此方法时,UnauthorizedAccessException 是否可以被抑制或成为现实?
在我看来,该方法应该有一个重载,接受一个动作来处理任何异常。
【问题讨论】:
-
是的,您的 Dump() 方法应该能够应对它试图转储的文件的问题。给它一个超载。
-
这不是我的问题,汉斯。问题是对文件迭代器 (EnumerateFiles) 的 foreach 会引发 UnauthorizedAccessException,进而停止进一步的枚举,这在需要详尽的结果集时是不可取的。
-
@Hans -
Dump()方法不是这里的问题,它只是遍历字符串枚举。问题在于Directory.EnumerateFiles方法本身。而且我认为没有办法解决这个问题。我相信你必须求助于SearchOption.TopDirectoryOnly并自己处理递归。 -
这(以及其他原因)是我最终为NtQueryDirectoryFile 自己编写包装器的原因。
-
我已经在stackoverflow.com/questions/13130052/… 上发布了一个解决方案。我发布的解决方案表现得像一个真正的 IEnumerable,因为它只有在需要工作时才有效。
标签: .net filesystems lazy-evaluation unauthorizedaccessexcepti