C # treeview Несанкционированное исключение - PullRequest
2 голосов
/ 31 января 2012

Итак, я следовал статье MS http://msdn.microsoft.com/en-us/library/ms171645.aspx

Это создание интерфейса стиля проводника с элементами управления ListView и TreeView с помощью конструктора.

Так что все хорошо, но вы устанавливаете его в корень C для сканирования всех папок и файлов и т. Д. Я получаю {"Access to the path '<path to file' is denied."}

VS 2010 указывает на эту проблему.

subSubDirs = subDir.GetDirectories();

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

Есть ли способ пропустить каталоги, к которым приложение не может получить доступ?

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Вы получаете исключение, потому что вызывающая учетная запись не имеет прав доступа к папкам, таким как System Volume Information. Вы можете обойти это некоторые , используя Linq и пропуская папки, помеченные System или Hidden.

DirectoryInfo root = new DirectoryInfo(@"C:\");

Func<FileSystemInfo, Boolean> predicate = dir =>
    (dir.Attributes & FileAttributes.System) != FileAttributes.System &&
    (dir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden;

IEnumerable<FileSystemInfo> directories = root.GetDirectories().Where(predicate);

foreach (DirectoryInfo directory in directories) {
    try {
        Trace.WriteLine(directory.Name);
        DirectoryInfo[] subdirectories = directory.GetDirectories();
    }
    catch (System.UnauthorizedAccessException) {
        Trace.WriteLine("Insufficient access rights.");
    }
}

Trace.WriteLine("End of application.");

Хотя это не решение для каждого сценария, и не будет работать для некоторых файлов и папок. Нет простого решения с использованием существующего API; вместо этого вы можете захотеть получить информацию о файлах и каталогах через WMI.

0 голосов
/ 31 января 2012

Возможно, вы попытались поймать не в том месте.Основываясь на коде в пошаговом руководстве, вы можете поставить триггер try следующим образом:

Заменить:

subSubDirs = subDir.GetDirectories();

на следующее:

try 
{
    subSubDirs = subDir.GetDirectories();
}
catch(UnauthorizedAccessException uae)
{
  //log that subDir.GetDirectories was not possible
}

Также строка:

if (subSubDirs.Length != 0)

следует изменить на:

if (subSubDirs != null && subSubDirs.Length != 0)
...