2

すべてのディレクトリ、サブディレクトリ、およびファイルを再帰的に取得できます。

これを行うのは、プログラミング ロジックを増やし、再帰のしくみを学びたいからです。

私はこの方法でそれを行うことを知っています:

 string path = "D://";
            string rezdir,newpath;
            DirectoryInfo di = new DirectoryInfo(path);
            DirectoryInfo[] dir = di.GetDirectories().ToArray();
            for (int i = 0; i < di.GetDirectories().Length; i++)
            {
                Console.WriteLine(dir[i].ToString());
            }
            Console.WriteLine("\n\nChoose File: ");
            rezdir = Console.ReadLine();
            newpath = path + rezdir;
            di = new DirectoryInfo(newpath);
            dir = di.GetDirectories().ToArray();
            for (int i = 0; i < di.GetDirectories().Length; i++)
            {
                Console.WriteLine(dir[i].ToString());
            }
            Console.ReadKey();

しかし、私は再帰的な方法でそれをしないので、誰かがこれを行うことができます.彼に感謝します.

4

3 に答える 3

1

ええ、それは可能です。ただし、最初に再帰とは何かを把握することをお勧めします。簡単に言うと、再帰には1回限りの実行部分と、複数回実行する部分があります。その1回は、何度もパートをトリガーします。

この質問では、1回限りの実行部分は、ルートディレクトリの下にあるすべてのディレクトリのリストを取得することである可能性があります。

次に、ディレクトリごとに、すべてのサブディレクトリとファイルを取得します。これは何度もある部分です。ただし、コードのバッチを何度も実行するには、それらを呼び出し可能なルーチン、プロシージャ、メソッド、関数にバンドルする必要があります。バンドルをコード化するだけです。

public void DoDirectories()
{
    // one-time part; get a list of directories to start with.
    List<string> rootDirectories = Directory.GetDirectories("c:\\").ToList();
    foreach (string rootDirectory in rootDirectories)
    {
        GetSubdirectories(rootDirectory);
    }
}

public List<string> GetSubdirectories(string parentDirectory)
{
    List<string> subdirecotries = Directory.GetDirectories(
        parentDirectory, "*.*", SearchOption.TopDirectoryOnly).ToList();
    foreach (string subdirectory in subdirecotries)
    {
        GetSubdirectories(subdirectory); // recursing happens here
    }
    return subdirecotries;
}
于 2013-02-17T12:31:38.860 に答える
1

これは貴重な学習演習であるため、コーディングは避けます。自分で完成させてみてください。一度完成すると、再帰を理解していることがわかります

再帰的にするには、メソッドはそれ自体を呼び出す必要があります。その方法を想像してみてください

public static void ShowDirectory(int indentationLevel, DirectoryInfo path)

すでにあなたのために書かれています。これにより、本文の記述が簡単になります。

  1. ディレクトリ内のすべてのファイルを取得し、ループ内でそれらの名前を出力します
  2. ディレクトリ内のすべてのディレクトリを取得し、次のインデントレベルでそれらのコンテンツを表示します。そのためには別のループが必要です。

最初のステップは、ループを作成するための簡単な演習です。ShowDirectory2番目の演習も、事前に作成されたものと考えることができるため、簡単になります。

于 2013-02-17T12:33:35.413 に答える
1

投稿したコードを見ると、ユーザーとのやり取りが必要なようです。次のようなものを試してください。

 public static class RecursiveTest
{
    public static string Foo(DirectoryInfo currentPath)
    {
        if (!currentPath.Exists) return string.Empty;

        foreach (var directory in currentPath.EnumerateDirectories())
            Console.WriteLine("Directory {0}", directory.Name);

        foreach (var file in currentPath.EnumerateFiles())
            Console.WriteLine("File {0}", file.Name);

        while(true)
        {
            Console.WriteLine("Choose directory or file: ");
            string chosenPath = Console.ReadLine();

            string newPath = Path.Combine(currentPath.FullName, chosenPath);
            if(Directory.Exists(newPath))
                return Foo(new DirectoryInfo(newPath));

            if(File.Exists(newPath))
                return newPath;

            Console.WriteLine("File {0} doesn't exist!", newPath);
        }
    }
}

そして、次のように呼び出します。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(RecursiveTest.Foo(new DirectoryInfo(@"d:\dev")));

        Console.ReadLine();
    }
}

HTH

于 2013-02-17T12:45:26.477 に答える