我有一个文件夹和文件的结构,我想在TreeView中读取并显示这些文件夹和文件。文件夹和文件都是我的C#Visual Studio环境中的对象。
文件夹对象包含:
- 文件集合
- 文件夹的集合
结构的顶层是一个文件夹。我从阅读开始,并使用foreach循环来获取此顶级中的所有文件。然后我需要阅读文件夹的集合,看看顶部文件夹是否包含其他文件夹。对于每个文件夹,我都需要重复同样的过程。
我可以从结构的顶层开始,检查该文件夹是否包含文件夹,但问题是我不知道该结构有多少层。文件夹可以相互嵌套,级别不受限制。如果我使用foreach循环,我必须将它们嵌套在一起,但嵌套循环的数量将决定我将读入多少层。
我正在寻找一个动态的解决方案,不断阅读结构,直到我到达最后一层,而不需要使用不必要的代码。
有人有解决方案吗?
图片1
结构的图像。图像中的所有文件夹和文件都可以作为对象进行访问。
图片2
用于在结构中循环的代码的图像。
使用BFS是很自然的(https://en.wikipedia.org/wiki/Breadth-firstrongearch)或递归。BFS按层遍历目录层次结构,如果使用递归版本,则存在堆栈溢出的危险。
示例:
static void SearchDir(string dirPath)
{
Queue<string> queue = new Queue<string>();
queue.Enqueue(dirPath);
while(queue.Count() != 0)
{
var actualDir = queue.Dequeue();
foreach(var file in Directory.GetFiles(actualDire)
//Output info about all files in the directory
foreach(var dir in Directory.GetDirectories(actualDir)
{
//Output info about all directories in the directory
queue.Enqueue(dir);
}
}
}
您需要执行递归。样品如下
static void Main(string[] args)
{
DeviceUserGroup folder = GetTopLevelGroupAsYouWish();
BuildHierarchy (folder);
Console.ReadKey();
}
static void BuildHierarchy(DeviceUserGroup userGroup)
{
try
{
foreach (Device device in userGroup.Devices)
Console.WriteLine(device.Name);
foreach (DeviceUserGroup group in userGroup.Groups)
{
Console.WriteLine(group.Name);
BuildHierarchy(group);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}