未经授权访问异常:使用getDirectories

4
大家好,目前我使用以下方式获取子目录:
```python ```
请注意,以上代码示例中的目录路径应该替换为您自己的路径。
foreach (DirectoryInfo dir in parent)
      {
        try
        {
          subDirectories = dir.GetDirectories().Where(d => d.Exists == true).ToArray();
        }
        catch(UnauthorizedAccessException e)
        {
          Console.WriteLine(e.Message);
        }
        foreach (DirectoryInfo subdir in subDirectories)
        {
          Console.WriteLine(subdir);
          var temp = new List<DirectoryInfo>();
          temp = subdir.GetDirectories("*", SearchOption.AllDirectories).Where(d => reg.IsMatch(d.Name)).Where((d => !d.FullName.EndsWith("TESTS"))).Where(d => !(d.GetDirectories().Length == 0 && d.GetFiles().Length == 0)).Where(d => d.GetFiles().Length > 3).ToList();
          candidates.AddRange(temp);
        }
      }

      foreach(DirectoryInfo dir in candidates)
      {
        Console.WriteLine(dir);
      }

现在我的问题是,由于子目录中的一个名为lost+found的文件夹导致我无法访问最终列表candidates,因此我什么也没有得到。我尝试使用try和catch来处理异常,以便我可以继续进行检查。其实我并不关心这个文件夹,而是想忽略它,但我不知道如何在get directories搜索中忽略它。你有什么想法吗?我已经尝试使用.where过滤器忽略包含该文件夹名称的任何文件夹,但这并没有起作用,它只是停止了我的程序在那个文件夹名称处。


此问题已经有答案,参见以下链接:link - wake-0
这是用于获取文件的代码,但我需要目录而不是文件。 - JPhillips
你尝试过使用 Directory.EnumerateDirectories() 吗?它提供了更多的灵活性,允许你至少获取找到的目录名称。不幸的是,像 lost+found 这样的隐藏系统目录会导致 UnauthorizedAccessException 异常。确保使用默认的 SearchOption,这样搜索就不会自动进入任何子目录。 - Berin Loritsch
程序在那之前就失败了,当执行'code'subDirectories = dir.GetDirectories();'code'时。 - JPhillips
2个回答

2
我有同样的问题(ResourceContext.GetForCurrentView调用异常)关于这个异常(UnauthorizedAccessException),而这个链接给出了为什么会出现这种情况的答案:

http://www.blackwasp.co.uk/FolderRecursion.aspx

翻译如下:

短引用:

… 其中最重要的是,您尝试读取的某些文件夹可能被配置为当前用户无法访问。该方法不会忽略您没有访问权限的文件夹,而是会抛出UnauthorizedAccessException异常。但是,我们可以通过创建自己的递归文件夹搜索代码来规避此问题。...

解决方案:

private static void ShowAllFoldersUnder(string path, int indent)
{
    try
    {
        foreach (string folder in Directory.GetDirectories(path))
        {
            Console.WriteLine("{0}{1}", new string(' ', indent), Path.GetFileName(folder));
            ShowAllFoldersUnder(folder, indent + 2);
        }
    }
    catch (UnauthorizedAccessException) { }
}

1
您可以像微软所解释的那样使用递归:链接

这与我的做法有什么不同,我只是在我的程序失败的地方使用了一个 try 和 catch 块,并尝试了多种方法来处理 catch 部分,但它仍然失败并且不能忽略一个失败。 - JPhillips
如果在迭代目录之前获取它们,尝试使用getDirectories调用时,catch不会影响foreach并退出它。 - Ben Philipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接