0

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

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

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

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

しかし、そうではありません。

4

2 に答える 2

4

やりたいことがこれで簡単にできる

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();
}
于 2012-07-19T18:07:38.767 に答える
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;

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

于 2012-07-19T17:59:33.470 に答える