如何忽略异常并继续处理foreach循环?

Bar*_*ert 5 .net c# foreach

我有一个测试程序,它应该遍历C:下的所有文件.当它到达"Documents and Settings"文件夹时它会死掉.我想忽略错误并继续循环其余文件.问题是,抛出异常foreach,所以把一个try/catchforeach会导致循环退出.并把一try/catchforeach永远不会触发(因为抛出异常foreach).有没有办法忽略异常并继续处理循环?

这是代码:

static void Main(string[] args)
{
    IEnumerable<string> files = Directory.EnumerateFiles(@"C:\", "*.*",
                                SearchOption.AllDirectories);
    foreach (string file in files)  // Exception occurs when evaluating "file"
        Console.WriteLine(file);
}
Run Code Online (Sandbox Code Playgroud)

ter*_*zio 1

您可能会收到 UnauthorizedAccessException 因为某些文件是隐藏的或系统文件。由于您正在使用字符串(来自枚举文件)而不是文件信息或目录信息对象,因此我重写了此文件以适合您的设计:

首先添加这2个成员变量:

private static Dictionary<DirectoryInfo, List<string>> DirectoryTree = new Dictionary<DirectoryInfo, List<string>>();
private static List<string> logger = new List<string>();
Run Code Online (Sandbox Code Playgroud)

然后放置这个方法:

static void RecursiveSearch(string root)
{
     string[] files = null;
     string[] subDirs = null;

     // First, process all the files directly under this folder 
     try
     {
        files = Directory.EnumerateFiles(root).ToArray();
     }
     catch (UnauthorizedAccessException e)
     {
         logger.Add(e.Message);
     }
     catch (System.IO.DirectoryNotFoundException e)
     {
         Console.WriteLine(e.Message);
     }

     if (files != null)
     {

          DirectoryTree.Add(new DirectoryInfo(root), files.ToList());
          subDirs = Directory.GetDirectories(root);

          foreach (string dir in subDirs)
          {
              RecursiveSearch(dir);
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

然后在 Main 中你可以这样称呼它:

RecursiveSearch(@"c:\");
Run Code Online (Sandbox Code Playgroud)

您的 DirectoryTree 字典和列表记录器将被填充后。