【问题标题】:How to ignore "Access to the path is denied" / UnauthorizedAccess Exception in C#?如何在 C# 中忽略“拒绝访问路径”/UnauthorizedAccess 异常?
【发布时间】:2012-01-16 08:50:25
【问题描述】:

如何绕过/忽略“访问路径被拒绝”/UnauthorizedAccess异常

继续以这种方法收集文件名;

public static string[] GetFilesAndFoldersCMethod(string path)
{
   string[] filenames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Select(Path.GetFullPath).ToArray();
   return filenames;
}

//正在调用... ...

foreach (var s in GetFilesAndFoldersCMethod(@"C:/"))
{
    Console.WriteLine(s);
}

我的应用程序在 GetFilesAndFoldersCMethod 的第一行停止并且出现异常; “访问路径 'C:\@Logs\' 被拒绝。”。请帮帮我...

谢谢,

【问题讨论】:

  • 在我看来你不能要求这个方法在遇到错误时继续枚举。我认为您将不得不推出自己的枚举器或找到另一个更灵活的类。

标签: c# windows file-io try-catch


【解决方案1】:

最好的方法是添加一个Try/Catch block 来处理异常...

try
{
   string[] filenames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Select(Path.GetFullPath).ToArray();
   return filenames;
}
catch (Exception ex)
{
   //Do something when you dont have access
   return null;//if you return null remember to handle it in calling code
}

你也可以专门处理UnauthorizedAccessException,如果你在这个函数中做其他代码并且你想确保它是一个导致它失败的访问异常(这个异常是由Directory.GetFiles函数抛出的)。 ..

try
{
   //...
}
catch(UnauthorizedAccessException ex)
{
    //User cannot access directory
}
catch(Exception ex)
{
    //a different exception
}

编辑:正如下面的 cmets 所指出的,您似乎正在使用 GetFiles 函数调用进行递归搜索。如果您希望它绕过任何错误并继续,那么您将需要编写自己的递归函数。 There is a great example here 这将满足您的需求。这是一个修改,应该正是您需要的......

List<string> DirSearch(string sDir) 
{
   List<string> files = new List<string>();

   try  
   {
      foreach (string f in Directory.GetFiles(sDir)) 
      {
         files.Add(f);
      }

      foreach (string d in Directory.GetDirectories(sDir)) 
      {
         files.AddRange(DirSearch(d));
      }
   }
   catch (System.Exception excpt) 
   {
      Console.WriteLine(excpt.Message);
   }

   return files;
}

【讨论】:

  • 枚举肯定也会停在那里
  • @DavidHeffernan:是的,但是枚举是在一个字符串数组上的——它是给定目录中的所有文件,并且由于该目录引发了访问异常,那么无论如何所有文件都将无法访问。我的假设是,如果用户正在搜索多个目录,那么他们在 for 循环示例周围有一个循环/递归函数。当然,我可能假设错了,必须等待 OP 响应才能确定
  • @DavidHeffernan:我的错误,我现在看到 GetFiles 调用正在执行递归工作
  • 非常感谢您的回答。请看第一个foreach; foreach(Directory.GetFiles(d) 中的字符串 f)-> 值 d 必须是“sDir”。
  • 请注意,虽然上面的示例应该可以正常工作,但如果要实现此代码,您应该考虑仅捕获 UnauthorizedAccessException。就像现在的代码一样,如果出现一些意外错误,它可能会给出难以调试的结果。 (只捕获您知道可以从中恢复的异常!)
【解决方案2】:

看看c#编程指南中的这篇文章:

How to: Iterate Through a Directory Tree (C# Programming Guide)

【讨论】:

    【解决方案3】:

    根据 MS 页面和 stackoverflow 上的各种尝试,我有一个似乎可行的解决方案,并且避免了所有 GetFiles()/GetDirectories() 异常。

    cfhttps://stackoverflow.com/a/10728792/89584

    (原始问题可能被视为与此重复,反之亦然)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2020-12-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多