您应该做的第一件事是更改您正在使用的方法:
var files = from f in System.IO.Directory.EnumerateDirectories(
@"\\testnetwork\abc$",
"*.*",
SearchOption.AllDirectories)
select f;
EnumerateDirectories
效果更好,因为它会产生结果,并且如果它找到一个没有权限的文件夹,仍然会抛出相同的异常。它产生结果的事实允许我们在它的输出之上进行组合,所以如果我们添加一个这样的扩展方法:
static class ExceptionExtensions
{
public static IEnumerable<TIn> Catch<TIn>(
this IEnumerable<TIn> source,
Type exceptionType)
{
using (var e = source.GetEnumerator())
while (true)
{
var ok = false;
try
{
ok = e.MoveNext();
}
catch(Exception ex)
{
if (ex.GetType() != exceptionType)
throw;
continue;
}
if (!ok)
yield break;
yield return e.Current;
}
}
}
那么我们就可以这样写:
var files = from f in System.IO.Directory.EnumerateDirectories(
@"\\testnetwork\abc$",
"*.*",
SearchOption.AllDirectories)
.Catch(typeof(UnauthorizedAccessException))
select f;
并且您的输出应该是预期的,同时仍保持 Linq 表达式的干净和可组合。该Catch
方法的想法是在不阻止其他异常发生的情况下“吞下”您不想要的异常。这是一个实施草案,但你明白了。