0

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

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

    }
}

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

  • 子文件夹 1
    • 子子文件夹1
      • 子子子文件夹1
      • 子子文件夹File1
    • 子子文件夹2
  • 子文件夹 2
    • 子文件夹File1

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

4

2 回答 2

2

There is an overload of GetDirectories you should use that allows you to define the search scope:

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

This will get all directories, including all the subdirectories all the way down.

The first argument is a search text filter, "*" will find all folders.

A complete example with indentation:

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();
}
于 2017-11-12T13:24:48.563 回答
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

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

于 2017-11-12T13:47:18.283 回答