c#资源管理器 非递归算法遍历所有文件
来源:互联网 发布:windows server 2014 编辑:程序博客网 时间:2024/05/22 14:44
序:前不久使用DEV的TreeList控件,需要根据输入内容定位到对应的节点,由于树的层数不确定,先前采用递归算法遍历Tree,但总觉得别扭,个人比较反感递归函数,好比一个脱缰的野马,难以控制。理论上说,所有递归算法都可以转换为非递归算法,因此决定不使用递归,上网搜了一些资料,最终成功搞定。
遍历硬盘文件的方法与TreeList是相似的,核心所在就是使用“栈stack”这个数据结构,先把所有驱动器压栈,比如C、D、E、F、G。然后依次遍历每个驱动器,如G:\,先将其出栈,获取该目录下的所有子目录和子文件,将子目录逐个压栈,子文件直接处理。这样处理后,位于栈顶的就是子目录,它里面包含的还有内容,将栈顶目录出栈,再获取该目录下的所有子目录和子文件,同样再将子目录压栈,如此重复,最终实现所有目录和文件的遍历。
来点实现的代码吧,在Form上拖放一个TreeView、ImageList,其中ImageList有3个图标,分别用于代表磁盘、文件夹、文件。
/// <summary>/// 生成目录树/// </summary>private void BuildTree(){//设置图像列表,并暂停重绘treeView1.ImageList = imageList1;treeView1.BeginUpdate();//存放树节点的栈Stack<TreeNode> skNode = new Stack<TreeNode>();int imageIndex = 0;//添加磁盘列表string[] drives = Directory.GetLogicalDrives();for (int i = 0; i < drives.Length; i++){ //每个节点的Text存放目录名,Name存放全路径 TreeNode node = new TreeNode(drives[i], 0, 0); node.Name = drives[i]; treeView1.Nodes.Add(node); skNode.Push(node);}while (skNode.Count > 0){ //弹出栈顶目录,并获取路径 TreeNode curNode = skNode.Pop(); string path = curNode.Name; FileInfo fInfo = new FileInfo(path); if ((fInfo.Attributes & FileAttributes.Directory) != 0) { string[] subDirs = null; string[] subFiles = null; try { //获取当前目录下的所有子目录和文件 subDirs = Directory.GetDirectories(path); subFiles = Directory.GetFiles(path); } catch { } if (subDirs != null && subFiles != null) { //目录入栈 imageIndex = 1; for (int i = 0; i < subDirs.Length; i++) { string dirName = Path.GetFileName(subDirs[i]); TreeNode dirNode = new TreeNode(dirName, 1, 1); dirNode.Name = subDirs[i]; curNode.Nodes.Add(dirNode); skNode.Push(dirNode); } //文件无需入栈 imageIndex = 2; for (int i = 0; i < subFiles.Length; i++) { string fileName = Path.GetFileName(subFiles[i]); curNode.Nodes.Add(subFiles[i], fileName, 2); } } }}treeView1.EndUpdate();}
界面截图:
测试一下,在我的电脑上遍历所有磁盘上的文件用了25秒,看来效果还不错!试着把与TreeView相关的操作去除,只是简单的遍历所有文件,再测用了10.2秒,共计402786个目录和文件,看来主要功夫都花在维护TreeView的结构上。测试代码如下:
private void button1_Click(object sender, EventArgs e){DateTime begin = DateTime.Now;BuildTree();DateTime end = DateTime.Now;TimeSpan time = end.Subtract(begin);MessageBox.Show(time.TotalSeconds.ToString());}
算法真是个好东西,奇妙无穷啊!!
- c#资源管理器 非递归算法遍历所有文件
- C# 非递归遍历所有子目录与子文件
- c#非递归遍历所有节点
- 递归遍历路径下所有文件算法
- 递归算法遍历文件夹中所有文件
- 文件夹遍历递归与非递归算法(C#实现)
- 遍历磁盘文件的递归和非递归算法
- 非递归遍历文件
- 非递归遍历文件
- 仿资源管理器(非递归)
- Win32非递归遍历和搜索文件以及目录算法
- Delphi下遍历文件夹下所有文件的递归算法
- 递归遍历某文件夹下所有文件的算法
- Delphi下遍历文件夹下所有文件的递归算法
- 非递归算法遍历目录
- java版 二叉树 所有递归和非递归遍历算法
- java版 二叉树 所有递归和非递归遍历算法
- java版 二叉树 所有递归和非递归遍历算法
- Tomcat jvm 内存
- SVN merge 三种方式
- iphone开发笔记
- 俞敏洪老师的这段话......
- js操作html页面写入excel
- c#资源管理器 非递归算法遍历所有文件
- hibernate学习笔记(1)
- SVN Tree Conflict 的分析
- IOS开发UI篇之──键盘添加工具条
- svn merge脚本
- Oracle append Hint(一)
- Debian Linux 系统安装完成后的配置
- iphone检测耳机插入/拔出
- svn merge和branch