最终效果:

使用到的窗体和控件 :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:
题外话:
问题一:可以直接把所有的节点递归遍历后全添加好吗?
答:可以但是开销太大;因为要把所有的文件都遍历一遍时间太长。
问题二:折叠节点后要把添加的文件节点再清除(有必要吗)
答:可做可不做,做了可以提前释放资源,不做在用户不打开很多很多节点的情况下没影响
本文介绍如何使用C#编程,在一个Form窗体中,通过TreeView控件展示磁盘目录结构。首先创建根目录"我的电脑",并添加C盘、D盘等子节点。接着,通过递归函数在用户展开节点时动态加载相应磁盘的文件和文件夹,以减少资源开销。最后,讨论了是否需要在折叠节点后清除已添加的文件节点。

1366

被折叠的 条评论
为什么被折叠?



