1. ホーム
  2. c#

ディレクトリ内のファイルを再帰的に検索する

2023-08-07 20:41:59

質問

私は、ディレクトリを通してファイルを再帰的に検索し、すべてのxmlファイルのリストを私に返すために、次のコードを持っています。 ルート ディレクトリの xml ファイルがリストに含まれないことを除いて、すべてうまく動作します。

最初にルートでディレクトリを取得し、次にファイルを取得するため、ルートでの GetFiles() 呼び出しが欠落しているので、その理由は理解できます。 私は foreach の前に GetFiles() 呼び出しを含めてみましたが、結果は私が期待するようなものではありませんでした。

public static ArrayList DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d, "*.xml"))
            {
                string extension = Path.GetExtension(f);
                if (extension != null && (extension.Equals(".xml")))
                {
                fileList.Add(f);
                }
            }
            DirSearch(d);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return fileList;
}

私のディレクトリ構造は以下のようなものです。

RootDirectory
        test1.0.xml
            test1.1.xml
            test1.2.xml
  2ndLevDir
            test2.0.xml
            test2.1.xml
  3rdLevDir
               test3.0.xml
               test3.1.xml

コードが返ります。

test2.0.xml
test2.1.xml
test3.0.xml
test3.1.xml

を含むすべてのファイルを返したい。

test1.0.xml
test1.1.xml
test1.2.xml

再帰についてあまりよく分かっていません。 何かご指摘があれば、非常に感謝します。

どのように解決するのですか?

あなたは このDirectory.GetFilesのオーバーロードは を使えば、例えばサブディレクトリを検索してくれます。

string[] files = Directory.GetFiles(sDir, "*.xml", SearchOption.AllDirectories);

このように1つの拡張子しか検索できませんが、次のような使い方ができます。

var extensions = new List<string> { ".txt", ".xml" };
string[] files = Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories)
                    .Where(f => extensions.IndexOf(Path.GetExtension(f)) >= 0).ToArray();

で、必要な拡張子を持つファイルを選択します(注:拡張子の大文字と小文字は区別されます)。


場合によっては、ファイルを ディレクトリ.EnumerateFilesメソッド :

foreach(string f in Directory.EnumerateFiles(sDir, "*.xml", SearchOption.AllDirectories))
{
    // do something
}

コードが適切なアクセス権限を持っていないアカウントで実行された場合のUnauthorizedAccessExceptionなど、スローされる可能性のある例外については、ドキュメントを参照してください。

UnauthorizedAccessExceptionが問題である場合は、以下のサイトで細かい回答を参照してください。 Directory.EnumerateFiles => UnauthorizedAccessExceptionを参照してください。 .