C# заполнение treeview и получение ошибок в каталогах, на чтение которых у меня нет разрешения


Я заполняю элемент управления treeview, c# visual studio 8, используя следующий код:

private TreeNode TraverseDirectory(string path)
    {
        TreeNode result = new TreeNode(path);
        foreach (var subdirectory in Directory.GetDirectories(path))
        {
            result.Nodes.Add(TraverseDirectory(subdirectory));
        }

        return result;
    }

Проблема в том, что если я нажимаю на, скажем, диск c:/, то я получаю ошибку на каталогах, которые у меня нет разрешения на чтение. Мой вопрос в том, как мне избежать показа тех каталогов, на которые у меня нет разрешения? Как бы я проверил это, а затем сказал приложению игнорировать их?

Спасибо Р.

2   2  

2 ответа:

Для упрощенного подхода:

TreeNode result;
try {
    string[] subdirs = Directory.GetDirectories(path);
    result = new TreeNode(path);
    foreach(string subdir in subdirs) {
        TreeNode child = TraverseDirectory(subdir);
        if(child != null) { result.Nodes.Add(child); }
    }
    return result;
} catch (FindTheSpecificException) {
    // ignore dir
    result = null;
}
return result;

лично я бы попробовал сделать какую-то ленивую загрузку, но IIRC это включает добавление фиктивных узлов со стандартным TreeView.

Что касается тестирования, я думаю, что этот предыдущий вопрос охватывает его: Как вы можете легко проверить, если доступ запрещен для файла в .NET?

Что касается указания приложению игнорировать его, просто поместите вызов result.Nodes.Add() внутри блока условий тестирования, поэтому, если разрешение не существует, узел не добавляется. Если вы решите пойти с try...catch, Убедитесь, что вы проглатываете правильный SecurityException, потому что есть и другие исключения, которые могут произойти здесь, но это все.