Игнорировать UnauthorizedAccessException при получении файлов и подкаталогов каталога - PullRequest
0 голосов
/ 07 мая 2020

Я использую приведенный ниже код, чтобы получить файлы и подкаталоги каталога, а затем заполнить элемент управления TreeView. Я получаю исключение UnauthorizedAccessException. Я пытался справиться с этим, используя try and catch, но тщетно ...

void GetFilesAndSubDirs(DirectoryInfo root, TreeNodeCollection nodes)
{
    FileInfo[] files = null;
    DirectoryInfo[] subDirs = null;

    try
    {
        files = root.GetFiles("*.*");
        subDirs = root.GetDirectories();
    }
    catch (UnauthorizedAccessException e)
    {
        MessageBox.Show(e.Message);
    }

    catch (DirectoryNotFoundException e)
    {
        MessageBox.Show(e.Message);
    }

    TreeNode parent = FindNode(root.Name, nodes);

    if (files != null)
    {
        foreach (FileInfo fiInfo in files)
        {
            TreeNode fileNode = new TreeNode(fiInfo.Name);
            fileNode.ImageIndex = 1;
            fileNode.SelectedImageIndex = 1;
            parent.Nodes.Add(fileNode);
        }
    }

    if (subDirs != null)
    {
        foreach (DirectoryInfo dirInfo in subDirs)
        {
            TreeNode dirNode = new TreeNode(dirInfo.Name);
            dirNode.ImageIndex = 0;
            dirNode.SelectedImageIndex = 0;
            parent.Nodes.Add(dirNode);
            GetFilesAndSubDirs(dirInfo, parent.Nodes);
        }
    }
}

UPDATE # 1

Когда я комментирую строку рекурсивного вызова, она работает нормально.

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Хотя ответ и комментарий в какой-то степени верны. Они не решают проблему; вы «пытаетесь поймать, но напрасно» - конечно, напрасно - вы так и сделали.

Сначала вы пытаетесь получить каталог с именем root - вы получите исключение и по-прежнему попробуйте продолжить с той же переменной «root», которая будет иметь значение NULL или, по крайней мере, установлено неправильно.

Когда вы получаете сообщение об ошибке (и по какой-то причине просто связываете это сообщение с пользователем напрямую), вы должны остановить процесс. У вас есть исключение (которое, безусловно, является причиной остановки обработки - это неожиданная ошибка) - вы никогда не могли предположить, что процесс после исключения будет выполняться должным образом.

Я предлагаю вам (в этом случае) показать окно сообщения и «вернуться» и не go вперёд в процесс.

Хотя это не свято и не священно - я предлагаю вам прочитать на «оборонительном» программирование (C#) «

РЕДАКТИРОВАТЬ # 1

Измените начало метода на следующую строку:

void GetFilesAndSubDirs(DirectoryInfo root, TreeNodeCollection nodes)
{
    FileInfo[] files = null;
    DirectoryInfo[] subDirs = null;

    try
    {
        files = root.GetFiles("*.*");
        subDirs = root.GetDirectories();
    }
    catch (UnauthorizedAccessException e)
    {
        MessageBox.Show(e.Message);
        return; // unexpected behavior : notice to user and stop
    }

    catch (DirectoryNotFoundException e)
    {
        MessageBox.Show(e.Message);
        return; // unexpected behavior : notice to user and stop
    }
0 голосов
/ 07 мая 2020

Это ожидаемое поведение или у вас должны быть права доступа к этому каталогу?

Вы пробовали запускать Visual Studio от имени администратора? Вы, как пользователь, можете иметь права на его просмотр, но приложение не обязательно.

...