C# 使用栈遍历磁盘文件和目录,非传统递归方法。
2013-01-06 12:12
656 查看
序:前不久使用DEV的TreeList控件,需要根据输入内容定位到对应的节点,由于树的层数不确定,先前采用递归算法遍历Tree,但总觉得别扭,个人比较反感递归函数,好比一个脱缰的野马,难以控制。理论上说,所有递归算法都可以转换为非递归算法,因此决定不使用递归,上网搜了一些资料,最终成功搞定。
遍历硬盘文件的方法与TreeList是相似的,核心所在就是使用“栈stack”这个数据结构,先把所有驱动器压栈,比如C、D、E、F、G。然后依次遍历每个驱动器,如G:\,先将其出栈,获取该目录下的所有子目录和子文件,将子目录逐个压栈,子文件直接处理。这样处理后,位于栈顶的就是子目录,它里面包含的还有内容,将栈顶目录出栈,再获取该目录下的所有子目录和子文件,同样再将子目录压栈,如此重复,最终实现所有目录和文件的遍历。
来点实现的代码吧,在Form上拖放一个TreeView、ImageList,其中ImageList有3个图标,分别用于代表磁盘、文件夹、文件。
虽然效率不是很明显,但是如果去除维护treeview的话,效率会提升1倍多。
遍历硬盘文件的方法与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); try { 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); } } } } catch { } } treeView1.EndUpdate(); }
虽然效率不是很明显,但是如果去除维护treeview的话,效率会提升1倍多。
相关文章推荐
- C#遍历目录树的方法(递归)
- 递归的一些方法使用:深度遍历路径中的所有文件和目录,删除一个有文件的文件夹
- c# 使用递归遍历所有文件目录
- C#递归方法遍历目录及子目录
- C#使用foreach语句遍历堆栈(Stack)的方法
- 绕过传统activex 在页面使用方法,使用c#写的activex控件
- C#遍历指定目录的递归-完美改进版+完整程序源码
- C#遍历目录树的递归
- c# 使用递归 循环遍历导航树结构 并解析
- 深入理解C#中foreach遍历的使用方法
- C#中使用WIN32API来遍历文件和目录
- 二叉树前序、中序和后序的遍历方法(递归、用栈和使用线索化)
- CaptainGan------使用递归方法实现,向FTP服务器上传整个目录结构、从FTP服务器下载整个目录到本地的功能
- Java 中使用递归遍历文件目录
- 采用递归的方法遍历目录 (转载)
- C#使用foreach遍历哈希表(hashtable)的方法
- yield 改写遍历目录方法,内存使用好低啊
- PHP使用递归方法遍历文件夹
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- PHP使用递归方式列出当前目录下所有文件的方法