TreeView控件应用--访问文件或文件夹(一)

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://www.mzph.cn/news/302365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凭自己本事单的身是一种怎样的体验?你根本配不上如此优秀的我!

全世界只有3.14 % 的人关注了数据与算法之美8月12号,微博网友烂剧斗士发了这么一条微博,称“看脱口秀大会这个哥没把我给笑死”。一位从事IT(黑客)的小哥哥,是这样回忆自己的求爱经历的↓↓#她根本配不上我这么聪明的男…

WPF 右下角弹窗的简单实现

软件中经常出现右下角弹窗,从下面缓缓弹出的,这次就做个简陋的实现,思路就是在窗口加载和关闭时执行动画DoubleAnimation今天懒得做界面了,只实现了功能。看看效果:下面看看代码:主窗口添加一个按钮 &#…

今年不容易,要懂得爱护自己

冬天到了,衣服逐层加厚,脖子老是皱巴巴的,坐在位置上老是觉得周身不舒服,小木提醒下大家该爱护一下自己的颈椎。这个像缩成一团的东西,是什么?打开以后,它就变成个旅行枕啦,就是我们…

实现多租户系统的一点思考

2020年突发的新冠疫情,让在线协同办公在疫情期间成为了刚需。我们也从 2020 年的 2月3 日开始在家远程办公,直到四月份。协同办公软件一下子火爆了起来,钉钉、企业微信、特别是腾讯会议等都在疫情期间表现突出,呈现出井喷式的发展…

都说Python库千千万,这几个你认识不?

目前,人工智能的应用日渐广泛。而作为人工智能核心的机器学习,是一门多领域的交叉学科,专门研究计算机模拟或实现人类学习行为的方法,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

50款大数据分析神器 :你还在用Excel

全世界只有3.14 % 的人关注了数据与算法之美你平时用什么大数据分析工具?D3? R? 还是Processing?PS和计算器...只有你还在用excel!工欲善其事,必先利其器!一款好的工具可以让你事半功倍。大数据…

WEB安全测试软件

为什么80%的码农都做不了架构师?>>> 五种必会软件: SubSonic CodeSmith Professional 4.1 HttpWatch Professional IE Developer Toolbar Fiddler 是一个web调试代理。它能够记录所有客户端和服务器间的http请求,允许你监视&…

python区域增长算法_区域增长算法

嘿大家好。我真的很难搞清楚这个逻辑,希望你能帮我。在我继续之前,我只想告诉你,我是业余程序员,也是一个初学者,没有任何形式的正式计算机科学培训,所以请容忍我。:D另外,我使用的是…

P6砖家:对不起,我没.NET5高并发经验,我要跑路了!

“秒杀活动”“抢红包”“微博热搜”“12306抢票”“共享单车拉新”等都是高并发的典型业务场景,那么如何解决这些业务场景背后的难点问题呢?秒杀系统中,QPS达到10万/s时,如何定位并解决业务瓶颈?明星婚恋话题不断引爆…

孩子觉得数学难?那是底子没打好!

孩子觉得数学难?那是底子没打好!(北师大学前教育博士帮你一起塑造孩子的数学思维!)要说陪娃写作业这事儿的状态和成果,用一句诗词就能概括:我本将心向明月,奈何明月照沟渠。陪得好&a…

python科学计算环境配置_ATLAS + NumPy + SciPy + Theano 的Python科学计算环境搭建

Theano是一个Python库,提供了定义、优化以及评估数学表达式的库,尤其适合处理高维数组。使用Theano能获得和C差不多的处理速度,并且当利用GPU进行计算时,效率要优于CPU上运行的C语言程序。利用Theano能快速验证各种算法模型。但是…

朋友圈有趣的灵魂都去哪了?这几个优质公号给你答案

全世界有3.14 % 的人已经关注了数据与算法之美又到每周限量推荐公众号的时间啦关注了那么多公众号,百无聊奈地看文章你是否觉得时间被浪费,生命被辜负了?在号的数量上做减法,质量上做加法接下来给大家推荐最近一直在阅读的几个优质…

Istio 1.10 发布及官网改版

本文译自 Istio 官方文档 [1],有部分修改。北京时间 5 月 19 日,我们很高兴地宣布 Istio 1.10 的发布!我们要特别感谢我们的发布经理 Sam Naser[2] 和 张之晗 [3],以及整个测试和发布工作组在 1.10 中的工作。这是我们 2021 年的第…

CSS各属性表

1、CSS 背景属性(Background) 属性描述CSSbackground在一个声明中设置所有的背景属性。1background-attachment设置背景图像是否固定或者随着页面的其余部分滚动。1background-color设置元素的背景颜色。1background-image设置元素的背景图像。1backgrou…

深入探讨编程到底需要知道多少数学知识

全世界只有3.14 % 的人关注了数据与算法之美这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。对于基本的编程,你需要知道下面的:加减乘除 — 实际上,电脑会帮你作加减乘除运算。你仅需要知道什么时候运用它们。模运算 —…

zabbix2.0安装与配置

一、zabbix服务端安装:官方下载:http://www.zabbix.com/download.php1.安装配置所需要软件(zabbix需要一个lamp环境)[rootlocalhost ~]# yum install httpd php php-devel php-gd php-bcmath php-mbstring mysql-devel mysql-serverphp-xml php-mysql gd…

BeetleX.FastHttpApi之控制器调度设计

为了可以更灵活地在Webapi应用服务中分配线程资源,BeetleX.FastHttpApi在线程调度上直接细化到Action级别;组件不仅可以精准控制每个Action的最大RPS限制,还能精细到控制使用多少线程资源来处理这些API的请求。接下来详细讲解组件针对这一块的…

Java类加载机制深度分析

为什么80%的码农都做不了架构师?>>> Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。研究类加载机制的第二个目的是让程序能动态的控制类加载&…

北大清华团队编写!200多个科学实验+视频,和爸爸一起在家做

自从2017年2月份教育部从小学一年级起将科学课列入必修课,学校、家长都意识到科学素养对于孩子成长的重要性。好多家长都跃跃欲试,想陪孩子把科学“玩”起来。可是具体到如何给孩子做科学启蒙,面对的问题还真不少:生活中有哪些科学…

如何搭建一个指标体系

2019独角兽企业重金招聘Python工程师标准>>> 今天跟大家聊聊,如何搭建一个指标体系。 1、什么是指标体系 “指标体系”这个概念是应用比较广泛的,我们从正式出版物中摘取一个定义: 指标体系,即统计指标体系&#xff0c…