/ / C#、ファイル、検索、再帰-ファイル拡張子を確認するためのC#再帰検索

c#ファイル拡張子をチェックするための再帰的検索 - C#、file、search、recursion

渡すディレクトリ内のファイルに特定の拡張子があるかどうかを確認します。

 public static bool ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string[] fileEntries = System.IO.Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
if (System.IO.Path.GetExtension(fileName).ToLower().Contains(pattern))
return true;

// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = System.IO.Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
return ProcessDirectory(subdirectory);

return false;
}

からの呼び出し:

bool foundPattern = false;
//recursive search - based on search pattern
if (System.IO.File.Exists(myDirectory) && System.IO.Path.GetExtension(myDirectory).Contains(pattern))
{
// This path is a file
foundPattern = true;
}
else if (System.IO.Directory.Exists(myDirectory))
{
// This path is a directory
foundPattern = ProcessDirectory(myDirectory);
}

問題は、結果が得られないことです(検索パターンで拡張子.xを要求すると仮定すると、拡張子.xzzのファイルがある場合でもfalseです-時々trueになり、時にはfalseになります)。

私がステップスルーすると、ディレクトリを見て、再帰的にディレクトリに入り、ファイルを調べているように見えます...

しかし、それはしません。

回答:

回答№1は2

コードにバグがあると思います:

// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = System.IO.Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
return ProcessDirectory(subdirectory);

次のようなものでなければなりません:

// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = System.IO.Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
if (ProcessDirectory(subdirectory))
return true;

それ以外の場合は、単一のサブディレクトリの結果のみを返します。 これは、関数の先頭にあるのと同じ種類のループです。最初から正しく実行しています。


回答№2の場合は3

あなたがしたいことはこれで簡単にできます

string path = @"C:temp";
string extension = "*.txt";
var files = Directory.GetFiles(path, extension);

//or recursivly
var files = Directory.GetFiles(path, extension, SearchOption.AllDirectories);

あなたの場合:

public static bool ProcessDirectory(string startPath, string pattern)
{
return Directory.GetFiles(startPath, pattern, SearchOption.AllDirectories).Any();
}