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