C# 非递归遍历所有子目录与子文件
2013-03-17 14:40
405 查看
非递归的遍历,使用栈来存储当前访问结点的子节点信息,用于接下来访问。
通过栈保存还没有访问的目录结点
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;
using System.Collections.Generic;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog()==DialogResult.OK)
{
string path = folderBrowserDialog1.SelectedPath;
this.textBox1.Text = path;
TreeNode node=new TreeNode("文件");
this.treeView1.Nodes.Add(node);
DirectoryInfo dir=new DirectoryInfo(path);
Traverse(node,dir);
}
}
/// <summary>
/// 非递归的遍历所有的子目录与文件
/// </summary>
/// <param name="node"></param>
/// <param name="dir"></param>
private void Traverse(TreeNode node, DirectoryInfo dir)
{
Stack<DirectoryInfo> stack_dir = new Stack<DirectoryInfo>(); // 用栈来保存没有遍历的子目录
Stack<TreeNode> stack_node = new Stack<TreeNode>();
DirectoryInfo currentDir = dir;
TreeNode currentNode = node;
stack_dir.Push(dir);
stack_node.Push(node);
while (stack_dir.Count != 0) // 栈不为空,说明还有子节点没有访问到
{
currentDir=stack_dir.Pop(); // 出栈,获取上一个结点
currentNode = stack_node.Pop(); // 出栈,获取上一个TreeNode
// 访问当前目录所有子目录
DirectoryInfo[] subDirs = currentDir.GetDirectories();
foreach (DirectoryInfo di in subDirs)
{
TreeNode d = new TreeNode(di.Name);
currentNode.Nodes.Add(d);
stack_node.Push(d); // 当前TreeNode结点入栈
stack_dir.Push(di); // 将子节点入栈
}
// 访问当前目录所有子文件
FileInfo[] files = currentDir.GetFiles();
foreach (FileInfo f in files)
{
// 将文件添加到结点中
TreeNode file = new TreeNode(f.Name);
currentNode.Nodes.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;
using System.Collections.Generic;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog()==DialogResult.OK)
{
string path = folderBrowserDialog1.SelectedPath;
this.textBox1.Text = path;
TreeNode node=new TreeNode("文件");
this.treeView1.Nodes.Add(node);
DirectoryInfo dir=new DirectoryInfo(path);
Traverse(node,dir);
}
}
/// <summary>
/// 非递归的遍历所有的子目录与文件
/// </summary>
/// <param name="node"></param>
/// <param name="dir"></param>
private void Traverse(TreeNode node, DirectoryInfo dir)
{
Stack<DirectoryInfo> stack_dir = new Stack<DirectoryInfo>(); // 用栈来保存没有遍历的子目录
Stack<TreeNode> stack_node = new Stack<TreeNode>();
DirectoryInfo currentDir = dir;
TreeNode currentNode = node;
stack_dir.Push(dir);
stack_node.Push(node);
while (stack_dir.Count != 0) // 栈不为空,说明还有子节点没有访问到
{
currentDir=stack_dir.Pop(); // 出栈,获取上一个结点
currentNode = stack_node.Pop(); // 出栈,获取上一个TreeNode
// 访问当前目录所有子目录
DirectoryInfo[] subDirs = currentDir.GetDirectories();
foreach (DirectoryInfo di in subDirs)
{
TreeNode d = new TreeNode(di.Name);
currentNode.Nodes.Add(d);
stack_node.Push(d); // 当前TreeNode结点入栈
stack_dir.Push(di); // 将子节点入栈
}
// 访问当前目录所有子文件
FileInfo[] files = currentDir.GetFiles();
foreach (FileInfo f in files)
{
// 将文件添加到结点中
TreeNode file = new TreeNode(f.Name);
currentNode.Nodes.Add(file);
}
}
}
}
}
相关文章推荐
- C# 向下遍历删除子目录和子文件 及 向上遍历空的父目录
- Java使用递归找出某目录下的所有子目录以及子文件
- 非递归方式遍历文件夹,取得所有子目录和文件的文件名和大小
- 续:C# 趣味小程序(4)——遍历特定目录及其子目录 (应用实例,压缩指定目录下的所有文件)
- C# 向下遍历删除子目录和子文件 及 向上遍历空的父目录
- MFC递归遍历目录下所有子目录和文件
- C#遍历文件夹及子目录下所有图片
- 遍历某一个指定目录下的所有子目录和文件(递归)
- C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)
- MFC递归遍历目录下所有子目录和文件
- php递归遍历所有目录及子目录和文件实例
- c#重载窗体关闭事件,遍历文件件下所有文件(及子目录),
- 遍历指定目录下所有子目录和子文件的函数
- C#递归读取目录里所有文件(包括子目录)及其文件操作
- C#递归读取目录里所有文件(包括子目录)及其文件操作
- 面试题-程序题-Java递归实现遍历文件目录(所有文件夹和子文件)
- C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)
- C#递归方法遍历目录及子目录
- VC/MFC 下 递归遍历目录下的所有子目录及文件
- C#递归遍历子目录与子目录中的文件