2

特定のファイルが含まれるすべてのフォルダー/ディレクトリのリストを取得したいと考えています。C# コードを使用してこれを行うにはどうすればよいですか。

例: 20 個のフォルダーがあり、そのうち 7 個に "abc.txt" という名前のファイルがあるとします。ファイル「abc.txt」があるすべてのフォルダーを知りたいです。

パス内のすべてのフォルダーを調べて、File.Exists(filename); しかし、すべてのフォルダーをループするのではなく、同じことを行う他の方法があるかどうかを知りたいです (多くのフォルダーがある場合、これは少し時間がかかるかもしれません)。

ありがとう
-ナヤン

4

2 に答える 2

8

Directory クラスのメソッドEnumerateFilesを検索パターンで使用し、SearchOption を使用して AllDirectories を含めます。これにより、パターンに一致するすべてのファイル (ディレクトリを含む完全なファイル名) が返されます。

Pathクラスを使用して、ファイルのディレクトリを取得します。

string rootDirectory = //your root directory;
var foundFiles = Directory.EnumerateFiles(rootDirectory , "abc.txt", SearchOption.AllDirectories);

foreach (var file in foundFiles){
  Console.WriteLine(System.IO.Path.GetDirectoryName(file));
}

EnumerateFiles は、.NET Framework 4 以降でのみ使用できます。古いバージョンの .NET Framework を使用している場合は、Directory クラスのGetFilesを使用できます。

更新 (PLB からのコメントを参照):

ディレクトリへのアクセスが拒否された場合、上記のコードは失敗します。この場合、例外を処理するために各ディレクトリを 1 つずつ検索する必要があります。

public static void SearchFilesRecursivAndPrintOut(string root, string pattern)
{
    //Console.WriteLine(root);
    try
    {
        var childDireactory = Directory.EnumerateDirectories(root);
        var files = Directory.EnumerateFiles(root, pattern);

        foreach (var file in files)
        {
            Console.WriteLine(System.IO.Path.GetDirectoryName(file));
        }

        foreach (var dir in childDireactory)
        {
            SearchRecursiv(dir, pattern);
        }
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception);
    }
}
于 2013-02-06T08:43:40.460 に答える
0

以下は、特定の条件で検索を絞り込む方法を示しています (つまり、名前に「Microsoft」、「IBM」、または「nHibernate」を含む DLL のみを含めます)。

var filez = Directory.EnumerateFiles(@"c:\MLBWRT", "*.dll", SearchOption.AllDirectories)
        .Where(
            s => s.ToLower().Contains("microsoft")
            && s.ToLower().Contains("ibm")
            && s.ToLower().Contains("nhibernate"));
string[] allFiles = filez.ToArray<string>();
for (int i = 0; i < allFiles.Length; i++) {
    FileInfo fInfo = new FileInfo(allFiles[i]);
    Console.WriteLine(fInfo.Name);
}
于 2013-10-09T14:59:59.037 に答える