在获取目录的文件和子目录时忽略UnauthorizedAccessException

问题描述 投票:0回答:2

我正在使用下面的代码来获取目录的文件和子目录,然后填充TreeView控件。我收到UnauthorizedAccessException异常。我尝试使用try-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);
        }
    }
}

更新

当我评论递归调用的行时,它很好用。

enter image description hereenter image description here

c# file directory treeview unauthorizedaccessexcepti
2个回答
0
投票

这是预期的行为还是您应该有权访问此目录?

您是否曾尝试以管理员身份运行Visual Studio?您作为用户可能有权查看它,但该应用程序不一定要查看它。


0
投票

尽管答案和评论在一定程度上是正确的。他们没有处理当前的问题;您“试图捉住但徒劳”-当然是徒劳的-您做到了。

首先,您尝试获取名为root的目录-您将获得异常,并仍然尝试继续使用相同的“ root”变量,该变量将为null或至少未正确设置。

[当您收到错误消息时(由于某种原因,仅将该消息与用户联系起来),您应该停止该过程。您有一个exception(这绝对是停止处理的原因-这是一个意外错误)-您将无法在异常将按预期方式运行后承担该过程。

我建议您(在这种情况下)显示消息框并“返回”,不要继续进行此过程。

尽管它不是神圣或神圣的,但我建议您阅读“防御性编程(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
    }
© www.soinside.com 2019 - 2024. All rights reserved.