博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TreeView控件应用--访问文件或文件夹(一)
阅读量:5951 次
发布时间:2019-06-19

本文共 10532 字,大约阅读时间需要 35 分钟。

C#TreeView访问文件或文件夹,通过递归,展开所有文件夹(类似资源管理器的树形窗体)

首先,算法是用递归算法,不断的递归文件。以此来遍历整个电脑的磁盘内容,过程也很简单。这种算法的时间复杂度太大。以至于窗体打开较慢,效率不高。

View Code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace FolderBrowserApp{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            try            {                //获取所有驱动盘目录                string[] s = Directory.GetLogicalDrives();                //通过遍历去添加所有父节点                foreach (string m in s)                {                    //父节点                    TreeNode node = new TreeNode(m);                    //给treeview添加节点                    this.treeView1.Nodes.Add(node);                    //调用方法递归出磁盘的所有文件,并将父节点和路径传入                    expendtree(m, node);                }            }            catch { }        }        private void expendtree(string path, TreeNode tn)        {            try            {                //获取父节点目录的子目录                string[] s1 = Directory.GetDirectories(path);                //子节点                TreeNode subnode = new TreeNode();                //通过遍历给传进来的父节点添加子节点                foreach (string j in s1)                {                    subnode = new TreeNode(j);                    tn.Nodes.Add(subnode);                    //对文件夹不断递归,得到所有文件                    expendtree(j, subnode);                }            }            catch { }        }    }}

分析以上代码,造成打开慢的原因是一开始就加载所有数据到TreeView控件中来,为了提高效率,可以等选用选择了相关的驱动器对象再来加载相关的文件夹,这样高效了很多。所以经过修改,再添加多一个ListBox把文件也显示出来。

View Code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace WindowsFormsApplication2{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            //显示各逻辑磁盘            string[] drivers = Directory.GetLogicalDrives();            foreach (string driver in drivers)            {                TreeNode node = new TreeNode(driver);                treeView1.Nodes.Add(node);                               //不再预先遍历文件夹               // expendtree(driver, node);            }        }        private void expendtree(string path, TreeNode tn)        {            try            {                //遍历指定的文件夹目录                string[] dirs = Directory.GetDirectories(path);                foreach (string dir in dirs)                {                    TreeNode subnode = new TreeNode(dir);                    tn.Nodes.Add(subnode);                    //不再遍历子文件夹                  //  expendtree(dir, subnode);                }            }            catch { }        }        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)        {            //选择节点的信息            TreeNode selnode = treeView1.SelectedNode;            string selname = treeView1.SelectedNode.Text;            //开始遍历选定的节点,并展开它            expendtree(selname, selnode);            selnode.Expand();            //加载选定节点文件夹的相关文件            string[] files = Directory.GetFiles(selname);            listBox1.Items.Clear();            foreach (string file in files)            {                listBox1.Items.Add(file);            }        }    }}

分析以上代码,看到文件夹显示的都是完整路径,这不是我们想要的,我们只需要显示文件夹名就可以了,所以,需要再次修改。

 using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication2

{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)

        {
            //显示各逻辑磁盘
            string[] drivers = Directory.GetLogicalDrives();
            foreach (string driver in drivers)
            {
                TreeNode node = new TreeNode(driver);
                treeView1.Nodes.Add(node);
            }

        }

        private void expendtree(string path, TreeNode tn)

        {
            try
            {
                //遍历指定的文件夹目录
                string[] dirs = Directory.GetDirectories(path);
                foreach (string dir in dirs)
                { 
                    //截取文件夹名,作节点名,不需要显示完整路径
                  string  mdir = dir.Substring(dir.LastIndexOf("\\") + 1, dir.Length - dir.LastIndexOf("\\") - 1);
                    TreeNode subnode = new TreeNode(mdir);
                    tn.Nodes.Add(subnode);
                }
            }
            catch { }
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

        {
            //选择节点的信息
            TreeNode selnode = treeView1.SelectedNode;
          //  string selname = treeView1.SelectedNode.Text;
           
            //修改国节点的完整路径
            string selname = selnode.FullPath;

            //开始遍历选定的节点,并展开它

            expendtree(selname, selnode);
            selnode.Expand();

            //加载选定节点文件夹的相关文件

            string[] files = Directory.GetFiles(selname);
            listBox1.Items.Clear();
            foreach (string file in files)
            {
                listBox1.Items.Add(file);
            }
        }
    }
}

 

 

 再次更改,呵呵,做成图片浏览工具,添加文件到列表框时,过滤图片文件

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace WindowsFormsApplication2{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            //显示各逻辑磁盘            string[] drivers = Directory.GetLogicalDrives();            foreach (string driver in drivers)            {                TreeNode node = new TreeNode(driver);                treeView1.Nodes.Add(node);            }        }        private void expendtree(string path, TreeNode tn)        {            try            {                //遍历指定的文件夹目录                string[] dirs = Directory.GetDirectories(path);                foreach (string dir in dirs)                {                      //截取文件夹名,作节点名,不需要显示完整路径                  string  mdir = dir.Substring(dir.LastIndexOf("\\") + 1, dir.Length - dir.LastIndexOf("\\") - 1);                    TreeNode subnode = new TreeNode(mdir);                    tn.Nodes.Add(subnode);                }            }            catch { }        }        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)        {            //选择节点的信息            TreeNode selnode = treeView1.SelectedNode;          //  string selname = treeView1.SelectedNode.Text;                        //修改国节点的完整路径            string selname = selnode.FullPath;            //开始遍历选定的节点,并展开它            expendtree(selname, selnode);            selnode.Expand();            //加载选定节点文件夹的相关文件            string[] files = Directory.GetFiles(selname);            listBox1.Items.Clear();            foreach (string file in files)            {               //在加载文件时,按扩展名来过滤文件,只显示jpg和bmp文件            string mfile=file.Substring(file.Length-3,3);            switch (mfile)            {                 case "jpg":                case "bmp":                listBox1.Items.Add(file);                break;                default:                break;            }                            }        }        private void listBox1_Click(object sender, EventArgs e)        {            //加载图片            if (listBox1.SelectedIndex > 0)            {                string file = listBox1.SelectedItem.ToString();                try                {                    pictureBox1.Image = Image.FromFile(file);                }                catch                { }                }        }    }}

 

 添加父节点及节点的状态图标,先给工程中添加ImageList控件,加载四个状态图标,

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace WindowsFormsApplication2{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            //显示各逻辑磁盘            string[] drivers = Directory.GetLogicalDrives();            foreach (string driver in drivers)            {                TreeNode node = new TreeNode(driver);                //逻辑磁盘图标两个状态不变                node.ImageIndex = 1;                node.SelectedImageIndex= 1;                treeView1.Nodes.Add(node);            }        }        private void expendtree(string path, TreeNode tn)        {            try            {                //遍历指定的文件夹目录                string[] dirs = Directory.GetDirectories(path);                foreach (string dir in dirs)                {                      //截取文件夹名,作节点名,不需要显示完整路径                  string  mdir = dir.Substring(dir.LastIndexOf("\\") + 1, dir.Length - dir.LastIndexOf("\\") - 1);                    TreeNode subnode = new TreeNode(mdir);                    //文件夹图标两个状态有变化                    subnode.ImageIndex = 2;                    subnode.SelectedImageIndex = 3;                    tn.Nodes.Add(subnode);                }            }            catch { }        }        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)        {            //选择节点的信息            TreeNode selnode = treeView1.SelectedNode;          //  string selname = treeView1.SelectedNode.Text;                        //修改国节点的完整路径            string selname = selnode.FullPath;            //开始遍历选定的节点,并展开它            expendtree(selname, selnode);            selnode.Expand();            try            {                //加载选定节点文件夹的相关文件                string[] files = Directory.GetFiles(selname);                listBox1.Items.Clear();                foreach (string file in files)                {                    //在加载文件时,按扩展名来过滤文件,只显示jpg和bmp文件                    string mfile = file.Substring(file.Length - 3, 3);                    switch (mfile)                    {                        case "jpg":                        case "bmp":                            listBox1.Items.Add(file);                            break;                        default:                            break;                    }                }            }            catch { }        }        private void listBox1_Click(object sender, EventArgs e)        {            //加载图片            if (listBox1.SelectedIndex > 0)            {                string file = listBox1.SelectedItem.ToString();                try                {                    pictureBox1.Image = Image.FromFile(file);                }                catch                { }                }        }    }}

 

转载地址:http://siixx.baihongyu.com/

你可能感兴趣的文章
基于泛型实现的ibatis通用分页查询
查看>>
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
从前后端分离到GraphQL,携程如何用Node实现?\n
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
nginc+memcache
查看>>
php正则匹配utf-8编码的中文汉字
查看>>
linux下crontab实现定时服务详解
查看>>