尝试将目录添加到TreeView时发生UnauthorizedAccessException

时间:2013-11-04 09:21:34

标签: c# treeview manifest directoryinfo unauthorizedaccessexcepti

我正在尝试向TreeView系统添加目录列表,但我遇到的问题似乎是用户访问问题。我已经尝试了解决这个问题的各种步骤,其中没有一个有效。其中包括:更改解决方案清单文件中的安全性,使用try catch跳过我无法访问的文件,并将我的Windows用户文件夹设置更改为完全控制(管理员)。我在整个网络中环顾四周寻找类似问题的答案,大多数人刚刚使用了try catch系统。这对我的系统不起作用,因为一切都冻结了,它就坐在那里。然后程序就像在我的整个计算机上找不到一个目录一样。我的代码包括:

  public Folder_Browser()
    {
        InitializeComponent();
        MapDirectory();
    }

    private void MapDirectory()
    {
        TreeNode rootNode;
        DirectoryInfo dirPrograms = new DirectoryInfo(@"/");
        DriveInfo[] loadedDrives = DriveInfo.GetDrives();

        foreach (DriveInfo dr in loadedDrives)
        {
            if (dr.DriveType != DriveType.Removable)
            {
                DirectoryInfo info = new DirectoryInfo(dr.Name);

                if (info.Exists)
                {
                    rootNode = new TreeNode(info.Name);
                    rootNode.Tag = info;
                    GetDirectories(info.GetDirectories(), rootNode);
                    treeView1.Nodes.Add(rootNode);
                }
            }
        }
    }

    private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
    {
        TreeNode aNode;
        DirectoryInfo[] subSubDirs;

        foreach (DirectoryInfo subDir in subDirs)

        {
            aNode = new TreeNode(subDir.Name, 0, 0);
            aNode.Tag = subDir;
            aNode.ImageKey = "folder";
            try
            {
                subSubDirs = subDir.GetDirectories();
                //ERROR HERE^^^^^^^
                if (subSubDirs != null && subSubDirs.Length != 0)
                {
                    GetDirectories(subSubDirs, aNode);
                }
                    nodeToAddTo.Nodes.Add(aNode);
            }
            catch (System.UnauthorizedAccessException)
            {

            }

        }
    }

每当我尝试实施其他人解决此类问题的解决方案时,我就不会得到任何类型的目录列表。该程序占用太多资源而忽略了它无法触及的文件夹。我忽略了一些简单的事情吗?或者这种方法不可能吗?任何帮助表示赞赏,干杯。

1 个答案:

答案 0 :(得分:0)

如果有人有这样的问题,我设法找到解决问题的解决方案。需要添加一个额外的函数,它控制程序如何与元素(目录)进行交互。此程序使用相同的源,跳过解决方案无法访问的目录(尝试catch),但使用System.Security.AccessControl允许它继续并找到可以访问的目录。功能如下:

  

使用System.Security.AccessControl;

 public static void SetAccessRule(string directory)
    {
        System.Security.AccessControl.DirectorySecurity Security = System.IO.Directory.GetAccessControl(directory);
        FileSystemAccessRule accountAllow = new FileSystemAccessRule(Environment.UserDomainName + "\\" + Environment.UserName, FileSystemRights.FullControl, AccessControlType.Allow);
        Security.AddAccessRule(accountAllow);
    }

有关此解决方案的更多信息以及我是如何获得的,可以在以下网址找到:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/206cfa9d-3e5b-43be-840f-49a221e10749/c-unauthorizedaccessexception-when-trying-to-programmically-copying-folder