C# 使用文件系统目录结构填充TreeView
我是新来这里的节点:)我提出了这个算法,但它只显示父节点的列表。。像这样C# 使用文件系统目录结构填充TreeView,c#,.net,winforms,treeview,directory-structure,C#,.net,Winforms,Treeview,Directory Structure,我是新来这里的节点:)我提出了这个算法,但它只显示父节点的列表。。像这样 a a.txt b c c m n b o p etc... a a.txt b o p c m n etc... 我希望下一个节点将放在上一个节点内的一个节点中。。所以结果会是这样的 a a.txt b c c m n b o p etc... a a.txt
a
a.txt
b
c
c
m
n
b
o
p
etc...
a
a.txt
b
o
p
c
m
n
etc...
我希望下一个节点将放在上一个节点内的一个节点中。。所以结果会是这样的
a
a.txt
b
c
c
m
n
b
o
p
etc...
a
a.txt
b
o
p
c
m
n
etc...
我有一些想法,但我可以将其实现到代码中……)请帮忙
private void ListDirectory(TreeView treeView, String path)
{
Stack<string> stack = new Stack<string>();
TreeNode DirFilesCollection = new TreeNode();
stack.Push(path);
while (stack.Count > 0)
{
string dir = stack.Pop();
try
{
List<String> parentDir = new List<string>();
parentDir.AddRange(Directory.GetFiles(dir, "*.*"));
parentDir.AddRange(Directory.GetDirectories(dir));
DirectoryInfo d = new DirectoryInfo(dir);
TreeNode TParent = new TreeNode(d.Name);
foreach (String s in parentDir)
{
FileInfo f = new FileInfo(s);
TreeNode subItems = new TreeNode(f.Name);
TParent.Nodes.Add(subItems);
}
DirFilesCollection.Nodes.Add(TParent);
foreach (string dn in Directory.GetDirectories(dir))
{
stack.Push(dn);
}
}
catch
{}
}
Action clearTreeView = () => treeView.Nodes.Clear();
this.Invoke(clearTreeView);
Action showTreeView = () => treeView.Nodes.Add(DirFilesCollection);
this.Invoke(showTreeView);
}
private void列表目录(TreeView TreeView,字符串路径)
{
堆栈=新堆栈();
TreeNode DirFilesCollection=新的TreeNode();
stack.Push(路径);
而(stack.Count>0)
{
string dir=stack.Pop();
尝试
{
List parentDir=新列表();
parentDir.AddRange(Directory.GetFiles(dir,“*”));
parentDir.AddRange(Directory.GetDirectories(dir));
DirectoryInfo d=新的DirectoryInfo(dir);
TreeNode TParent=新的TreeNode(d.名称);
foreach(parentDir中的字符串s)
{
FileInfo f=新的FileInfo;
TreeNode子项=新的TreeNode(f.Name);
t租金.节点.添加(子项);
}
dirfilescolection.Nodes.Add(TParent);
foreach(Directory.GetDirectories(dir)中的字符串dn)
{
堆栈推送(dn);
}
}
抓住
{}
}
Action clearTreeView=()=>treeView.Nodes.Clear();
调用(clearTreeView);
操作showTreeView=()=>treeView.Nodes.Add(dirfilescolection);
调用(showTreeView);
}
选项1:递归方法:
private void ListDirectory(TreeView treeView, string path)
{
treeView.Nodes.Clear();
var rootDirectoryInfo = new DirectoryInfo(path);
treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}
private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
var directoryNode = new TreeNode(directoryInfo.Name);
foreach (var directory in directoryInfo.GetDirectories())
directoryNode.Nodes.Add(CreateDirectoryNode(directory));
foreach (var file in directoryInfo.GetFiles())
directoryNode.Nodes.Add(new TreeNode(file.Name));
return directoryNode;
}
private static void ListDirectory(TreeView treeView, string path)
{
treeView.Nodes.Clear();
var stack = new Stack<TreeNode>();
var rootDirectory = new DirectoryInfo(path);
var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory };
stack.Push(node);
while (stack.Count > 0)
{
var currentNode = stack.Pop();
var directoryInfo = (DirectoryInfo)currentNode.Tag;
foreach (var directory in directoryInfo.GetDirectories())
{
var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory };
currentNode.Nodes.Add(childDirectoryNode);
stack.Push(childDirectoryNode);
}
foreach (var file in directoryInfo.GetFiles())
currentNode.Nodes.Add(new TreeNode(file.Name));
}
treeView.Nodes.Add(node);
}
选项2:非递归方法:
private void ListDirectory(TreeView treeView, string path)
{
treeView.Nodes.Clear();
var rootDirectoryInfo = new DirectoryInfo(path);
treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}
private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
var directoryNode = new TreeNode(directoryInfo.Name);
foreach (var directory in directoryInfo.GetDirectories())
directoryNode.Nodes.Add(CreateDirectoryNode(directory));
foreach (var file in directoryInfo.GetFiles())
directoryNode.Nodes.Add(new TreeNode(file.Name));
return directoryNode;
}
private static void ListDirectory(TreeView treeView, string path)
{
treeView.Nodes.Clear();
var stack = new Stack<TreeNode>();
var rootDirectory = new DirectoryInfo(path);
var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory };
stack.Push(node);
while (stack.Count > 0)
{
var currentNode = stack.Pop();
var directoryInfo = (DirectoryInfo)currentNode.Tag;
foreach (var directory in directoryInfo.GetDirectories())
{
var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory };
currentNode.Nodes.Add(childDirectoryNode);
stack.Push(childDirectoryNode);
}
foreach (var file in directoryInfo.GetFiles())
currentNode.Nodes.Add(new TreeNode(file.Name));
}
treeView.Nodes.Add(node);
}
私有静态无效列表目录(TreeView TreeView,字符串路径)
{
treeView.Nodes.Clear();
var stack=新堆栈();
var rootDirectory=newdirectoryinfo(路径);
var node=newtreenode(rootDirectory.Name){Tag=rootDirectory};
栈推(节点);
而(stack.Count>0)
{
var currentNode=stack.Pop();
var directoryInfo=(directoryInfo)currentNode.Tag;
foreach(directoryInfo.GetDirectories()中的var目录)
{
var childDirectoryNode=newtreenode(directory.Name){Tag=directory};
currentNode.Nodes.Add(childDirectoryNode);
stack.Push(childDirectoryNode);
}
foreach(directoryInfo.GetFiles()中的var文件)
currentNode.Nodes.Add(新树节点(file.Name));
}
treeView.Nodes.Add(节点);
}
@vrynxzent-如果您感兴趣,也可以使用非递归方法更新答案。啊。。我懂了。。我更喜欢使用非递归函数,因为线程和try-catch。。我也可以使用递归方法,但我需要查看在获取文件和目录时更新数据的形式。我使用了递归和迭代函数,这是我的代码,但编译器返回一个错误:拒绝访问路径“E:\System Volume Information\”。;这是我的代码:ListDirectory(treeView1,@“E:\”;对UnauthorizedAccessException使用try catch。我在currentNode.Nodes.Add()中遇到异常。我将其更改为currentNode.ChildNodes.Add(),它可以工作