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

时间:2017-11-12 13:13:17

标签: c# system.io.fileinfo system.io.directory

这是我到目前为止所做的:

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();

    }
}

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

  • Subfolder1
    • SubSubfolder1
      • SubSubSubfolder1
      • SubSubfolderFile1
    • SubSubfolder2
  • Subfolder2
    • SubfolderFile1

我一直试图多次这样做,但我无法弄清楚如何,也许我错过了一些命令(这​​是我第一次用c#System.IO编程) 你可以给我一些提示或告诉我应该使用哪些命令吗?我疯了。

2 个答案:

答案 0 :(得分:2)

您应该使用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();
}

答案 1 :(得分:0)

要浏览所有子文件夹,您需要递归函数。基本上,您必须重复当前仅针对根目录应用于您遇到的所有目录的过程。

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

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增加1。
  3. 这是一种通过树状结构的相当标准的方法。