如何打印每个子目录,但每个子目录在打印之前应该被选中

时间:2018-06-13 20:08:58

标签: c# recursion directory

我正在尝试打印每个子目录而不使用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;
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

我会把它写成。只需使用级别参数并将其称为

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

答案 1 :(得分: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 :(得分:1)

这是一种方法,我在评论中谈到的是什么。请注意,我们使用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);
    }
}

答案 3 :(得分:0)

目前还不清楚您是想要每个目录的完整路径还是只需要该目录名称,因此在给定布局的情况下,我只假设了名称。这是......

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