【问题标题】:how to print every subdirectory, but every subdirectory should be tabbed in before its printed如何打印每个子目录,但每个子目录在打印之前都应该被制表符
【发布时间】:2018-11-23 12:29:22
【问题描述】:

我试图在不使用 SearchOption.AllDirectories 的情况下打印每个子目录,仅使用 Directory.GetDirectories 我正在使用递归。我的主要问题是打印出前面有两个空格的每个子目录,如下所示:

1
  1,1
    1,1,1
2
  2,1
3
etc...

    class Program
{

    static void Main(string[] args)
    {

        string path = @"D:\Heaven Benchmark 4.0";
        WriteDirectories(path);

        Console.ReadKey();

    }
    static void WriteDirectories(string path)
    {
        string[] dirs = Directory.GetDirectories(path/*, "*", SearchOption.AllDirectories*/);
        for (int i = 0; i < dirs.Length; i++)
        {
            Console.Write(dirs[i] + "\n");
            if (Directory.GetDirectories(dirs[i]).Length > 0)
            {
                Console.Write("  "); WriteDirectories(dirs[i]);continue;
            }
        }
    }
}

【问题讨论】:

  • 也许可以使用方法的另一个参数跟踪缩进,并在执行递归调用时增加它?

标签: c# recursion directory


【解决方案1】:

我不懂 C#,所以有些语法可能是错误的,但你可以这样做

static void WriteDirectories(string path, int level)
{
    string[] dirs = Directory.GetDirectories(path/*, "*", SearchOption.AllDirectories*/);
    for (int i = 0; i < dirs.Length; i++)
    {
        int l = level;
        while (l > 0) {
            Console.Write("  ");
            l -= 1;
        }
        Console.Write(dirs[i] + "\n");
        if (Directory.GetDirectories(dirs[i]).Length > 0)
        {
            WriteDirectories(dirs[i], level + 1);continue;
        }
    }
}

在您的初始调用中,只需传递 0 即可。或者,如果您不想公开此内容,请创建一个具有此内容的私有辅助函数,并使仅接受路径的面向公众的函数调用此内容,级别为 0。

【讨论】:

    【解决方案2】:

    我会这样写。只需使用 level 参数并将其称为

    WriteDirectories(path,0);
    

    static void WriteDirectories(string path,int level)
    {
        string[] dirs = Directory.GetDirectories(path);
        foreach(var dir in dirs)
        {
            Console.WriteLine("".PadLeft(level*2, ' ') +  dir);
            WriteDirectories(dir, level + 1);
        }
    }
    

    【讨论】:

      【解决方案3】:

      不清楚您是想要每个目录的完整路径还是只需要该目录名称,因此考虑到布局,我只假设名称。在这里……

          static void Main(string[] args)
          {
              WriteDirectories(@"D:\Heaven Benchmark 4.0");
              Console.ReadKey();
          }
      
          private static void WriteDirectories(string path, int depth = 0)
          {
              string leafName = Path.GetFileName(path);
              string indent = new string(' ', depth * 2);
              Console.WriteLine($"{indent}{leafName}");
      
              string[] directories = Directory.GetDirectories(path);
              foreach (var directory in directories)
              {
                  WriteDirectories(directory, depth + 1);
              }
          }
      

      【讨论】:

        【解决方案4】:

        这是我在评论中所说的一种方法。请注意,我们使用Path.GetFileName 仅获取目录名称(没有完整路径),因此带有缩进的输出看起来更好一些:

        static void WriteDirectories(string path, int indent = 0)
        {
            Console.WriteLine(new string(' ', indent * 2) + Path.GetFileName(path));
        
            foreach (string subDir in Directory.GetDirectories(path))
            {
                WriteDirectories(subDir, indent + 1);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-04-08
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          • 2021-07-07
          • 1970-01-01
          相关资源
          最近更新 更多