2016-05-25 6 views
4

Привет всем В настоящее время я получил подкаталоги Я хотел через этот призыв:UnauthorizedAccessException с GetDirectories

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 + найдены в моей папке подкаталогов в блоке try. Я попытался использовать try и catch для обработки исключения, поэтому я мог продолжать делать свои проверки. На самом деле я не забочусь об этой папке, и я пытаюсь просто игнорировать ее, но я не уверен, как обойти это без моего поиска. мысли? Я уже пробовал делать фильтр с. Где игнорировать любую папку, содержащую имя папки, но это не работает, либо просто остановило мою программу в имени папки.

+0

Этот вопрос уже ответил, см следующее: [ссылка] (http://stackoverflow.com/questions/172544/ignore-folders-files-when- directory-getfiles-is-denied-access) –

+0

Это для получения файлов, но мне нужны каталоги, а не файлы – JPhillips

+0

Вы пытались использовать 'Directory.EnumerateDirectories()'? Это обеспечивает немного большую гибкость и позволяет вам, по крайней мере, получить имена каталогов по мере их нахождения. К сожалению, скрытые системные каталоги, такие как 'lost + found', вызовут' UnauthorizedAccessException'. Убедитесь, что вы используете по умолчанию 'SearchOption', поэтому поиск не пытается автоматически войти в какой-либо из дочерних каталогов. –

ответ

0

Вы можете использовать рекурсию, как объясняет Microsoft: link.

+0

как это отличается от того, что я делаю, я просто использую блок try и catch в области, где моя прога и я пробовал несколько способов обработки части catch, но он все еще терпит неудачу и не игнорирует ошибку. – JPhillips

+0

Если вы получаете каталоги до того, как вы перебираете их, то при попытке вызова getDirectories улов не повлияет на foreach и выйдет из него –

0

У меня есть один и тот же вопрос (ResourceContext.GetForCurrentView call exception) об этом исключение (UnauthorizedAccessException), и эта связь дает ответ на причины, почему это происходит:

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

Короткая цитата:

... Ключом среди них является то, что некоторые из папок, которые вы пытаетесь сделать , могут быть b e, чтобы текущий пользователь не мог получить к ним доступ. Вместо того, чтобы игнорировать папки, к которым у вас ограниченный доступ, метод генерирует исключение 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) { } 
}