c# System.IO 如何找到给定某个文件夹的所有子文件夹?

c# System.IO how do i find all the subfolders given a certain folder?

这是我目前所做的:

class Program
{

    static void Main(string[] args)
    {

        DirectoryInfo startDirectory = new DirectoryInfo(@"C:\Users\Angelo\Desktop\ExerciseTest");

        string output = "";

        DirectoryInfo[] subDirectoryes = startDirectory.GetDirectories();

        for (int i = 0; i < subDirectoryes.Length; i++)
        {
            output = output + subDirectoryes[i].ToString() + "\r\n";
        }

        Console.WriteLine(output);

        Console.ReadLine();

    }
}

这给了我指定文件夹的第一个子文件夹,问题是我需要找到指定文件夹中的所有子文件夹、子子文件夹、子子文件夹等和文件,然后用这个输出它们缩进:

我已经尝试了很多次,但我不知道怎么做,也许我遗漏了一些命令(这​​是我第一次用 c# 编程 System.IO) 你能给我一些提示或告诉我应该使用什么命令吗?我要疯了。

您应该使用 an overload of GetDirectories 来定义搜索范围:

DirectoryInfo[] subDirectoryes = 
              startDirectory.GetDirectories("*", SearchOption.AllDirectories);

这将获取所有目录,包括所有子目录。

第一个参数是搜索文本过滤器,“*”将找到所有文件夹。

带缩进的完整示例:

void Main()
{
    var path = @"C:\Users\Angelo\Desktop\ExerciseTest";
    var initialDepth = path.Split('\').Count();

    DirectoryInfo startDirectory = new DirectoryInfo(path);

    StringBuilder sb = new StringBuilder();

    DirectoryInfo[] subDirectoryes = startDirectory.GetDirectories("*", SearchOption.AllDirectories);

    for (int i = 0; i < subDirectoryes.Length; i++)
    {
        var level = subDirectoryes[i].FullName.Split('\').Count() - initialDepth;
        sb.AppendLine($"{new string('\t', level)}{subDirectoryes[i].Name}");
    }

    Console.WriteLine(sb.ToString());

    Console.ReadLine();
}

为了遍历所有子文件夹,您需要递归函数。基本上,您必须将当前仅适用于根目录的过程重复到您遇到的所有目录。

编辑:不得不花一点时间来提供这个代码示例:

class Program
{
    static void Main(string[] args)
    {
        var basePath = @"C:\Users\Angelo\Desktop\ExerciseTest";

        DirectoryInfo startDirectory = new DirectoryInfo(basePath);
        IterateDirectory(startDirectory, 0);

        Console.ReadLine();
    }

    private static void IterateDirectory(DirectoryInfo info, int level)
    {
         var indent = new string('\t', level);
         Console.WriteLine(indent + info.Name);
         var subDirectories = info.GetDirectories();

         foreach(var subDir in subDirectories)
         {
             IterateDirectory(subDir, level + 1);
         }
     }
 }

一点解释,IterateDirectory 的作用(按要求):

  1. 它打印带缩进的目录名称,这取决于目录子树中的当前级别。
  2. 对于当前目录中的每个目录:调用IterateDirectory方法,level加一。

这是遍历树状结构的一种相当标准的方法。