Как игнорировать "Доступ к пути запрещен" / 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
(Оригинальный вопрос может считаться дубликатом этого, или наоборот).