C# 动态枚举对象/文件夹结构#

C# 动态枚举对象/文件夹结构#,c#,object,treeview,structure,treenode,C#,Object,Treeview,Structure,Treenode,我有一个文件夹和文件的结构,我想在树视图中读取和显示。文件夹和文件都是我的C#Visual Studio环境中的对象 文件夹对象包含: 文件集 文件夹集合 结构的顶层是一个文件夹。我从阅读开始,使用foreach循环获取顶层中的所有文件。然后,我需要读取文件夹集合,以查看顶部文件夹是否包含其他文件夹。对于每个文件夹,我需要重复相同的过程 我可以从结构的顶层开始,检查该文件夹是否包含文件夹,但问题是我不知道该结构存在多少层。文件夹可以相互嵌套,级别不限。如果我使用foreach循环,我必须将它

我有一个文件夹和文件的结构,我想在树视图中读取和显示。文件夹和文件都是我的C#Visual Studio环境中的对象

文件夹对象包含:

  • 文件集
  • 文件夹集合
结构的顶层是一个文件夹。我从阅读开始,使用foreach循环获取顶层中的所有文件。然后,我需要读取文件夹集合,以查看顶部文件夹是否包含其他文件夹。对于每个文件夹,我需要重复相同的过程

我可以从结构的顶层开始,检查该文件夹是否包含文件夹,但问题是我不知道该结构存在多少层。文件夹可以相互嵌套,级别不限。如果我使用foreach循环,我必须将它们彼此嵌套,但嵌套循环的数量将决定我将读入多少层

我正在寻找一个动态的解决方案,以保持阅读结构,直到我到达最后一层,而不需要使用不必要的代码

有人有解决办法吗

结构的图像。图像中的所有文件夹和文件都可以作为对象访问


用于在结构中循环的代码的图像。

您需要执行递归。样本如下

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);
            }
        }
使用BFS()或递归是很自然的。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 SearchDir(字符串dirPath)
{
队列=新队列();
排队(dirPath);
while(queue.Count()!=0)
{
var actualDir=queue.Dequeue();
foreach(目录.GetFiles(actualDire)中的var文件)
//输出有关目录中所有文件的信息
foreach(目录中的var dir.GetDirectories(actualDir)
{
//输出有关目录中所有目录的信息
排队(dir);
}
}
} 

您可以递归遍历树这是您的答案…问题是结构无法通过文件路径访问。对象是从连接到外部软件程序的API检索的。这给了我一个最高层的文件夹对象。我必须在Visual Studio中本地读取此文件夹,因此无法使用递归。我添加了另一张图片来向您展示我所做的过程。根据图片2更改了代码