c#递归搜索以检查文件扩展名

c#递归搜索以检查文件扩展名,c#,file,search,recursion,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

我想检查我传递的目录中的文件是否有特定的扩展名

 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的文件,我也会得到false,假设我在搜索模式中请求扩展名为.x,有时会得到true,有时会得到false)

如果我一步一步地看,它看起来就像我在看目录,递归地进入目录,浏览文件


但事实并非如此。

我认为您的代码中有一个bug:

// 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;
否则,只返回单个子目录的结果。
这和函数开头的循环是一样的。您第一次就做对了。

我认为您的代码中有一个bug:

// 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;
否则,只返回单个子目录的结果。
这和函数开头的循环是一样的。你第一次就做对了。

你想做的事情可以很容易地用这个来完成

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

你想做的事情可以很容易地用这个来完成

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

使用为您执行递归的
GetFiles
重载:
Directory.GetFiles(“*.x*”,SearchOption.AllDirectories)
。您使用的搜索模式是什么?是
*.x*
?谁是您方法代码中的“模式”?我没有看到它被声明或作为参数传递使用为您执行递归的
GetFiles
重载:
Directory.GetFiles(“*.x*”,SearchOption.AllDirectories)
。您使用的搜索模式是什么?是
*.x*
?谁是您方法代码中的“模式”?我没有看到它被声明或作为参数传递