Как игнорировать "Доступ к пути запрещен" / UnauthorizedAccess Exception в C#?

Как обойти / игнорировать "Доступ к пути запрещен"/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, и появляется исключение; Msgstr "Доступ к пути" C:\@Logs\ "запрещен." Пожалуйста, помогите мне...

Спасибо,

3 ответа

Решение

Лучший способ сделать это - добавить блок Try/Catch для обработки исключения...

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
}

РЕДАКТИРОВАТЬ: Как указано в комментариях ниже, кажется, что вы делаете рекурсивный поиск с помощью вызова функции GetFiles. Если вы хотите, чтобы это обходило любые ошибки и продолжало, вам нужно написать собственную рекурсивную функцию. Здесь есть отличный пример, который будет делать то, что вам нужно. Вот модификация, которая должна быть именно то, что вам нужно...

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;
}

Взгляните на эту статью в руководстве по программированию на C#:

Как перебирать дерево каталогов (Руководство по программированию в C#)

Основываясь на странице MS и различных попытках здесь на stackru, у меня есть решение, которое, кажется, работает, и избегает всех исключений GetFiles()/GetDirectories().

ср /questions/23255787/neobhodimo-vozobnovit-popyitku-posle-blokirovaniya-catch/23255799#23255799

(Оригинальный вопрос может считаться дубликатом этого, или наоборот).

Другие вопросы по тегам