一、前言

Treeview控件常用于遍历本地文件信息,通常与Datagridview与ImageList搭配。ImageList控件用于提供小图片给TreeView控件,DatagridView通常显示TreeNode节点下文件及文件夹的信息。

效果图:

     

二、代码

初始化窗体:

private void ManagerForm_Load(object sender, EventArgs e)
{
InitialDataGridView(dgv_Local); //初始化本地dgv InitialTreeView(); //初始化本地tree
}

初始化DataGridView:

 public void InitialDataGridView(DataGridView dgv)
{
DataGridViewColumn dgv_check = new DataGridViewCheckBoxColumn();
dgv_check.HeaderText = "选择";
dgv.Columns.Add(dgv_check); DataGridViewColumn dgv_name = new DataGridViewTextBoxColumn();
dgv_name.HeaderText = "名称";
dgv.Columns.Add(dgv_name);
dgv_name.ReadOnly = true; DataGridViewColumn dgv_length = new DataGridViewTextBoxColumn();
dgv_length.HeaderText = "大小";
dgv.Columns.Add(dgv_length);
dgv_length.ReadOnly = true; DataGridViewColumn dgv_type = new DataGridViewTextBoxColumn();
dgv_type.HeaderText = "类型";
dgv.Columns.Add(dgv_type);
dgv_type.ReadOnly = true; DataGridViewColumn dgv_version = new DataGridViewTextBoxColumn();
dgv_version.HeaderText = "版本";
dgv.Columns.Add(dgv_version);
dgv_version.ReadOnly = true; dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgv.AllowUserToAddRows = false;
dgv.RowHeadersVisible = false;
dgv.AllowUserToResizeRows = false;
dgv.Columns[].Width = (int)((double)(dgv.Width) * 0.1);
dgv.Columns[].Width = (int)((double)(dgv.Width) * 0.45);
}

初始化本地TreeView:

public void InitialTreeView()
{
TreeNode tv_mycomputer = new TreeNode("我的电脑");
tv_mycomputer.ImageIndex = ;
tv_mycomputer.SelectedImageIndex = ;
tv_Local.Nodes.Add(tv_mycomputer); DriveInfo[] drives = DriveInfo.GetDrives();
string driveName = "";
foreach (DriveInfo drive in drives)
{
switch (drive.DriveType)
{
case DriveType.Fixed:
driveName = "本地磁盘(" + drive.Name.Substring(, ) + ")";
break;
case DriveType.Removable:
driveName = "可移动磁盘(" + drive.Name.Substring(, ) + ")";
break;
case DriveType.CDRom:
driveName = "DVD驱动器(" + drive.Name.Substring(, ) + ")";
break;
case DriveType.Network:
driveName = "网络驱动器(" + drive.Name.Substring(, ) + ")";
break;
default:
driveName = "未知(" + drive.Name + ")";
break;
}
TreeNode tr_cd = new TreeNode();
tr_cd.Text = driveName;
tr_cd.ImageIndex = ;
tr_cd.SelectedImageIndex = ;
LoadDirectory(Path.GetFullPath(drive.Name), tr_cd); //取得第一级磁盘信息
tv_mycomputer.Nodes.Add(tr_cd);
}
}

LoadDirectory方法:

public void LoadDirectory(string path, TreeNode tNode)
{
try
{
//遍历文件夹信息
string[] directorys = Directory.GetDirectories(path);
foreach (string item in directorys)
{
if ((File.GetAttributes(item) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
TreeNode tn_Dir = new TreeNode(Path.GetFileName(item));
tn_Dir.ImageIndex = ;
tn_Dir.SelectedImageIndex = ;
tn_Dir.Name = item;
tNode.Nodes.Add(tn_Dir);
}
}
if (path.Contains("System Volume Information"))
{
return;
} //遍历文件信息
string[] files = Directory.GetFiles(path);
foreach (string item in files)
{
string eName = Path.GetExtension(item);
if ((File.GetAttributes(item) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
TreeNode tn_file = new TreeNode(Path.GetFileNameWithoutExtension(item));
tn_file.ImageIndex = ;
tn_file.SelectedImageIndex = ;
tn_file.Name = item;
tNode.Nodes.Add(tn_file);
}
}
}
catch { }
}

AfterExpand方法:用于点击Node时快速加载,而不是在窗体加载时直接加载整个电脑的磁盘信息,因为那样太慢了

 private void tv_Local_AfterExpand(object sender, TreeViewEventArgs e)
{
if (e.Node.Level >= )
{
foreach (TreeNode tnode in e.Node.Nodes)
{
tnode.Nodes.Clear();
if (!Path.HasExtension(tnode.Name))
{
LoadDirectory(tnode.Name, tnode);
}
}
}
}

NodeMouseClick:点击Node显示该节点信息

private void tv_Local_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
Thread.Sleep();
if(e.Node.FullPath=="我的电脑")
{
txt_Local.Text = "My Computer";
}
else if(e.Node.FullPath.Contains("(")&&e.Node.Level<=)
{
txt_Local.Text = e.Node.FullPath.Split('\\')[].Split('(')[].Replace(')','\\');
}
else
{
txt_Local.Text = e.Node.Name;
this.dgv_Local.Rows.Clear();
if (e.Node.Level > )
{
Loadallinfo(e.Node.Name, dgv_Local);
}
} }

Loadallinfo:用于DataGridview显示信息

 public void Loadallinfo(string path,DataGridView dgv)
{
if (Directory.Exists(path))
{
try
{
string[] directorys = Directory.GetDirectories(path); //获取选中treeview节点的子目录
foreach (string item in directorys)
{
if ((File.GetAttributes(item) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
int index = dgv.Rows.Add();
dgv.Rows[index].Cells[].Value = item;
dgv.Rows[index].Cells[].Value = CountSize(GetDirectoryLength(item)).ToString();
dgv.Rows[index].Cells[].Value = "文件夹";
dgv.Rows[index].Cells[].Value = "";
}
}
if (path.Contains("System Volume Information"))
{
return;
}
string[] files = Directory.GetFiles(path);
foreach (string item in files)
{
string eName = Path.GetExtension(item);
if ((File.GetAttributes(item) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
int index = dgv.Rows.Add();
dgv.Rows[index].Cells[].Value = item;
System.IO.FileInfo file = new System.IO.FileInfo(item);
dgv.Rows[index].Cells[].Value = CountSize(file.Length).ToString();
dgv.Rows[index].Cells[].Value = Path.GetExtension(item);
if (Path.GetExtension(item) == ".dll")
{
FileVersionInfo ver = FileVersionInfo.GetVersionInfo(item);
dgv.Rows[index].Cells[].Value = ver.FileVersion;
}
else
{
dgv.Rows[index].Cells[].Value = "";
}
}
}
}
catch { } }
else if (File.Exists(path))
{
try
{
string item = path;
int index = dgv.Rows.Add();
dgv.Rows[index].Cells[].Value = item;
dgv.Rows[index].Cells[].Value = CountSize(item.Length).ToString();
dgv.Rows[index].Cells[].Value = Path.GetExtension(item);
if (Path.GetExtension(item) == ".dll")
{
FileVersionInfo ver = FileVersionInfo.GetVersionInfo(item);
dgv.Rows[index].Cells[].Value = ver.FileVersion;
}
else
{
dgv.Rows[index].Cells[].Value = "";
}
}
catch { }
} }

计算文件大小:

 #region 文件大小换算
public static string CountSize(long Size)
{
string m_strSize = "";
long FactSize = ;
FactSize = Size;
if (FactSize < 1024.00)
m_strSize = FactSize.ToString("F2") + " B";
else if (FactSize >= 1024.00 && FactSize < )
m_strSize = (FactSize / 1024.00).ToString("F2") + " K";
else if (FactSize >= && FactSize < )
m_strSize = (FactSize / 1024.00 / 1024.00).ToString("F2") + " M";
else if (FactSize >= )
m_strSize = (FactSize / 1024.00 / 1024.00 / 1024.00).ToString("F2") + " G";
return m_strSize;
}
#endregion #region 文件夹大小计算
public static long GetDirectoryLength(string path)
{
if (!Directory.Exists(path))
{
return ;
}
long size = ;
DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo fi in di.GetFiles())
{
size += fi.Length;
}
DirectoryInfo[] dis = di.GetDirectories();
if (dis.Length > )
{
for (int i = ; i < dis.Length; i++)
{
size += GetDirectoryLength(dis[i].FullName);
}
}
return size;
}
#endregion

基于Treeview控件遍历本地磁盘的更多相关文章

  1. C#TreeView控件遍历文件夹下所有子文件夹以及文件

    一直对递归的理解不深刻,有时候觉得很简单,可是用起来总会出错.这里需要在TreeView控件里显示一个文件夹下的所有目录以及文件,毫无意外的需要用到递归. 一开始,想到用递归写一个生成每一个节点(Tr ...

  2. 用TreeView控件遍历磁盘目录

    实现效果: 知识运用: ListView控件中Items集合的Add方法  TteeView控件中Nodes集合的Add方法 实现代码: private void Form1_Load(object ...

  3. 【Treeview】遍历本地磁盘

    一.前言 Treeview控件常用于遍历本地文件信息,通常与Datagridview与ImageList搭配.ImageList控件用于提供小图片给TreeView控件,DatagridView通常显 ...

  4. Visual Studio 2010下ASPX页面的TreeView控件循环遍历

    如果维护一个老系统就总会遇到各种问题,而这次是TreeView的循环遍历.对于Visual Studio2010上aspx页面的TreeView控件,我感受到了什么叫集微软之大智慧.与二叉树型不一样. ...

  5. Delphi下Treeview控件基于节点编号的访问

    有时我们需要保存和重建treeview控件,本文提供一种方法,通过以树结构节点的编号访问树结构,该控件主要提供的方法如下:      function GetGlobeNumCode(inNode:T ...

  6. Delphi下Treeview控件基于节点编号的访问1

    有时我们需要保存和重建treeview控件,本文提供一种方法,通过以树结构节点的编号访问树结构,该控件主要提供的方法如下:      function GetGlobeNumCode(inNode:T ...

  7. 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。

    利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...

  8. VB TreeView控件使用详解

    来源:http://www.newxing.com/Tech/Program/VisualBasic/TreeView_587.html 三小时快速掌握TreeView树状控件的使用.能不能掌握控件的 ...

  9. TreeView控件例子

    XmL文件代码: <?xml version="1.0" encoding="utf-8" ?> <Area> <Province ...

随机推荐

  1. ios视频播放器,代码和界面分离

    最近业余时间整理的一个ios播放器,界面采用storyboard,以前几乎都是用代码布局,但是用过一个项目storyboard后,就感觉storyboard很靠谱,团队合作版本控制的问题解决其实很简单 ...

  2. ABP理论学习之SignalR集成

    返回总目录 本篇目录 介绍 安装 建立连接 内置功能 你自己的SignaR代码 介绍 Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易.查看SignalR文档获 ...

  3. UITableView(一)

    #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource, ...

  4. Tomcat无故自动退出的问题

    我在这篇文章<写一个脚本,自动启动Tomcat>中提到Tomcat会无缘无故退出,而且在日志中找不到原因.后来终于知道为什么了: 由于内存不足,被OOM Killer杀死的!由于是直接被系 ...

  5. AngularJs之一

    在讲正题之前,先说一下有关angular简介方面的信息: 1. angularJS  诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用 ...

  6. salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List

    salesforce给我们提供了标准的页面,比如标准的页面包括标准的列表和标准的详细页视图.有的时候我们想要自定义视图,比如做一个项目的时候不希望使用者直接通过ID查看到标准的详细页,而是跳转到指定处 ...

  7. sun.misc.BASE64Encoder找不到jar包的解决方法

    1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...

  8. android studio和eclipse中如何获取sha1值

    首先如果是eclipse的话, 直接打开eclipse开发工具 那么接下来问题来了,现在很多开发者都已经从es转型到as开发工具了, 在android studio上没有直接提供这个GUI界面让我们去 ...

  9. LINQ系列:LINQ to DataSet的DataView操作

    1. 创建DataView EnumerableRowCollection<DataRow> expr = from p in products.AsEnumerable() orderb ...

  10. 移动混合应用HTML5数据查询优化

    项目介绍 pheongap混合应用,跨平台,做应用加工厂提供应用模板编辑器~ 本地应用,完全是模拟IOS,安卓原生应用的实现,所以支持14种手势,所有PPT动画,视觉差效果,等等功能组合... 这是I ...