,你應該做的第一件事就是改變方法使用的是:
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
方法的想法是「吞併」你不想要的異常,而不會阻止其他異常發生。這是一個草案實施,但你明白了。
我更新了我的答案,正如Wasp所提到的,因爲最後一個答案引發錯誤,請檢查它。 –