.net - 有没有办法从 Directory.EnumerateFiles 中的异常中恢复?

标签 .net linq exception enumerate

在 .NET 4 中,有这个 Directory.EnumerateFiles()看起来很方便的递归方法。
但是,如果在递归中发生异常,我如何继续/恢复并继续枚举其余文件?

try
{
  var files = from file in Directory.EnumerateFiles("c:\\",
                           "*.*", SearchOption.AllDirectories)
              select new
              {
                File = file
              };

  Console.WriteLine(files.Count().ToString());

}
catch (UnauthorizedAccessException uEx)
{
  Console.WriteLine(uEx.Message);
}
catch (PathTooLongException ptlEx)
{
  Console.WriteLine(ptlEx.Message);
}

最佳答案

我确实找到了解决方案。通过使用堆栈来压入枚举结果,确实可以处理异常。这是一个代码片段:(灵感来自 this article )

List<string> results = new List<string>();
string start = "c:\\";
results.Add(start);
Stack<string> stack = new Stack<string>();

do
{
  try
  {
    var dirs = from dir in Directory.EnumerateDirectories(
                     start, "*.*", SearchOption.TopDirectoryOnly)
                select dir;

    Array.ForEach(dirs.ToArray(), stack.Push);
    start = stack.Pop();
    results.Add(start);
  }
  catch (UnauthorizedAccessException ex)
  {
    Console.WriteLine(ex.Message);
    start = stack.Pop();
    results.Add(start);
  }

} while (stack.Count != 0);

foreach (string file in results)
{
  Console.WriteLine(file);
}

关于.net - 有没有办法从 Directory.EnumerateFiles 中的异常中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2559064/

相关文章:

c# - 获取错误 : NullReferenceException was not handled

c# - Azure Function 正常运行一段时间后无法加载程序集

c# - 扩展 WCF 服务及其自动生成的客户端服务引用

c++ - out_of_range、range_error 和 over/underflow_error 之间的区别?

c# - 如何使用 LINQ-to-Entity 按包含的对象进行查询

c# - 如何获得不同的列表类型列表

list - 对象引用未设置为对象的实例- “Object includes a list property”

.net - F#中的数组遍历

.net - 为什么构造的委托(delegate)类的调用方法是虚拟的?

c# - 如何使用 linq lambda 语法查找具有精确长度的子集