如何打印每个子目录,但每个子目录都应在打印之前按 Tab 键插入



我正在尝试打印每个子目录而不使用SearchOption.AllDirectory,仅使用Directory.GetDirectory为此我使用递归。 我的主要问题是打印出每个子目录,前面有两个空格,如下所示:

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

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

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

我不懂 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 即可获得级别。或者,如果您不想公开此函数,请创建一个具有此函数的专用帮助程序函数,并使仅接受路径的面向公众的函数调用 this ,级别为 0。

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

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

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

最新更新