2012-01-16 3 views
1

Как байпаса/игнорировать «Доступ к пути запрещен»/UnauthorizedAccess исключенияКак игнорировать «Доступ к пути запрещен»/UnauthorizedAccess Exception в C#?

и продолжают для сбора имен файлов в этом методе;

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

// Calling ... ...

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

Мое приложение останавливается на FIRSTLINE из GetFilesAndFoldersCMethod и исключение говорит; «Доступ к пути» C: \ @ Logs \ 'is denied. ". Пожалуйста, помогите мне ...

Спасибо,

+0

Не выглядит так, как будто вы можете запросить, чтобы этот метод продолжал перечисляться, когда он сталкивается с ошибкой. Я думаю, вам придется перевернуть свой собственный счетчик или найти другой класс, который будет более гибким. –

ответ

7

Лучший способ сделать это, чтобы добавить 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 
} 

EDIT: Как указано в комментариях ниже, вы видите, что вы выполняете рекурсивный поиск с помощью вызова функции 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; 
} 
+0

Несомненно, перечисление также остановится там –

+0

@DavidHeffernan: Да, но перечисление находится в строковом массиве, который является всеми файлами в данной директории, и поскольку в этом каталоге выбрано исключение доступа, тогда все файлы будут недоступны в любом случае. Мое предположение состоит в том, что если пользователь ищет несколько каталогов, то у них есть цикл/рекурсивная функция вокруг примера для цикла. Конечно, я мог ошибаться, придется ждать ответа OP, чтобы быть уверенным. – musefan

+0

@DavidHeffernan: Моя ошибка. Теперь я вижу, что вызов GetFiles выполняет рекурсивную работу. – musefan

0

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

ср https://stackoverflow.com/a/10728792/89584

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

Смежные вопросы