C#磁盘目录通过TreeView控件显示

本文介绍如何使用C#编程,在一个Form窗体中,通过TreeView控件展示磁盘目录结构。首先创建根目录"我的电脑",并添加C盘、D盘等子节点。接着,通过递归函数在用户展开节点时动态加载相应磁盘的文件和文件夹,以减少资源开销。最后,讨论了是否需要在折叠节点后清除已添加的文件节点。

最终效果:

 

使用到的窗体和控件  :Form窗体、TreeView控件

思路:主要是几个自定义private函数

第一步:创建一个根目录“我的电脑”    ,在根目录下添加第二级节点“C盘”、“D盘”等

  //加载电脑的第一级和第二级
        private void load_directory()
        {
            treeView1.ImageList = imageList1;//让我们的treeView可以使用imagelist图标

            //创建顶级节点“我的电脑”
            TreeNode topNode = new TreeNode("我的电脑");
            topNode.Name = "我的电脑";
            
            topNode.ImageIndex = 0;//加入图标
            treeView1.Nodes.Add(topNode);//添加到treeview

            //电脑下的磁盘  做第二级节点
            add_panfu(topNode);
            
        }
//循环遍历获取电脑的所有磁盘符,把所有的磁盘放入tree的节点中
        private void add_panfu(TreeNode topNode)
        {
            //循环遍历计算机所有逻辑驱动器名称(盘符)

            foreach (string drive in Environment.GetLogicalDrives())

            {

                //实例化DriveInfo对象 命名空间System.IO
                var dir = new DriveInfo(drive);
                switch (dir.DriveType)           //判断驱动器类型
                {

                    case DriveType.Fixed:        //仅取固定磁盘盘符 Removable-U盘

                  {

                    //Split仅获取盘符字母

                    TreeNode tNode = new TreeNode(dir.Name.Split(':')[0]);//这个是节点视图的显示文本
    
                    tNode.Name = dir.Name;//这个是节点的名称
                    tNode.Tag = tNode.Name;//这个是节点附带的信息,可以帮程序员存点东西
                    tNode.ImageIndex = 1;      //设置显示图片
                    topNode.Nodes.Add(tNode);//添加到驱动节点
                    tNode.Nodes.Add("");//添加空节点以保证有加号,如果其下没节点那是没有展开的加号的  
                            
                  }
                break;
            }
        }
    }

 

调用写好的函数

    private void Form1_Load(object sender, EventArgs e)
        {
            load_directory();
        }

 

结果截图:

此时我们打开节点发现只有我们添加的空节点,所以我们接下来还要进入到磁盘中把其下的第三级文件夹、文件填到树上

第二步:将一个父节点的下一级文件和文件夹  创建节点放入到该父节点下

     //把父文件夹下面的所有文件夹、文件偏历一遍并添加到节点下
        private void add_childNode( TreeNode parentNode)
        {
            DirectoryInfo directory = new DirectoryInfo(parentNode.Name);

            if (parentNode.Name != "我的电脑")//如果是打开”我的电脑“节点就啥也不做

            {
                parentNode.Nodes.RemoveAt(0);//先把空节点去掉

                try//为什么要加try catch呢因为在C盘有些文件夹是拒绝我访问的,不加trycatch会报错,当然也会忽略我无法访问的文件而已  
                {

                    foreach (FileSystemInfo fsinfo in directory.GetFileSystemInfos())//得到当前文件夹中的所有文件夹与文件   directory对象有三种获得其内容的方法
                    {
                        //如果是文件就直接创建子节点加入父节点即可
                        if (fsinfo is FileInfo)
                        {
                            TreeNode childNode = new TreeNode(fsinfo.Name);
                            childNode.ImageIndex = 3;
                            parentNode.Nodes.Add(childNode);
                        }
                        //如果是文件夹除了创建子节点加入父节点  还要遍历其内容
                        else if (fsinfo is DirectoryInfo)
                        {
                            TreeNode childNode = new TreeNode(fsinfo.Name);
                            childNode.Name = fsinfo.FullName;
                            childNode.ImageIndex = 2;
                            parentNode.Nodes.Add(childNode);
                            childNode.Nodes.Add("");//在子文件下加上空节点保证有加号

                        }

                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }

调用写好的函数

       //在将要节点展开+号的之前的响应事件调用,这样我们就可在展开节点时把子节点都添加上
 

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            add_childNode(e.Node);
        }

效果截图:

如果你达到这样的效果,那么恭喜你你已经可以完成任务了,有兴趣的朋友可以继续看下面的内容。

PS:

 

 

 

 

题外话:

问题一:可以直接把所有的节点递归遍历后全添加好吗?

答:可以但是开销太大;因为要把所有的文件都遍历一遍时间太长。

 

问题二:折叠节点后要把添加的文件节点再清除(有必要吗)

答:可做可不做,做了可以提前释放资源,不做在用户不打开很多很多节点的情况下没影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值