【问题标题】:How can recursively search directories with multiple wildcards?如何递归搜索具有多个通配符的目录?
【发布时间】:2012-11-08 19:27:05
【问题描述】:

使用 C# (.NET),如何在给定目录搜索掩码的情况下搜索文件系统:(?)

\\server\Scanner\images\*Images\*\*_*

例如,我需要先找到所有顶级目录:

\\server\Scanner\images\Job1Images
\\server\Scanner\images\Job2Images

...那么我需要继续使用搜索掩码:

\\server\Scanner\images\Job1Images\*\*_*
\\server\Scanner\images\Job2Images\*\*_*

这似乎并不太复杂,但我一生都无法弄清楚......

如上所述,我使用的是 C# 和 .NET。搜索可能试图定位目录或文件。 (即 *.txt 或 )

【问题讨论】:

  • 所以我不清楚您的通配符是什么 - 您是否正在寻找名称中带有下划线的特定文件或目录(基于您的示例)?
  • 对不起...我正在寻找适合整个面具的东西。例如,“\\server\Scanner\images\Job1Images\file.txt”不起作用,但它不适合整个掩码。只有像“\\server\Scanner\images\Job1Images\Folder2\MyFile_File.txt”这样的东西才能工作。这有意义吗?
  • 我没有得到递归部分。你想匹配 \\server\Scanner\images\recursive\Job1Images**_* 吗?
  • 您只想要在 JobImages 文件夹的子文件夹中找到的文件?您不想要 JobImages 文件夹中的文件吗?
  • 除非我误解了您要查找的内容,否则我的回答不会完全满足您的需求吗?如果不是,为什么不呢?您要查找的内容并不完全清楚

标签: c# .net search path directory


【解决方案1】:

像这样:

顶级目录:

  //get Top level
   string[] TopLevel = Directory.GetDirectories(path);

然后您必须使用通配符模式对此文件夹执行递归函数, 例如:

 // Only get subdirectories that begin with the letter "p." 
            string pattern = "p*";
            string[] dirs = folder.GetDirectories(path, pattern);

我建议您使用通配符来获取数组输出,您会发现 如果使用递归函数或直接查询路径,这是最好的方法。

【讨论】:

    【解决方案2】:

    编辑:啊,.NET 4 的新功能,因此您不必执行递归函数(感谢 Matthew Brubaker)

    IEnumerable<String> matchingFilePaths2 = System.IO.Directory.EnumerateFiles(@"C:\some folder to start in", filePatternToMatchOn, System.IO.SearchOption.AllDirectories);
    




    第一个答案:

    //get all files that have an underscore - searches all folders under the start folder
    List<String> matchingFilePaths = new List<string>();
    String filePatternToMatchOn = "*_*";
    FileUtilities.GetAllFilesMatchingPattern(@"C:\some folder to start in", ref matchingFilePaths, filePatternToMatchOn);
    

    ...

    public static void GetAllFilesMatchingPattern(String pathToGetFilesIn, ref List<String> fullFilePaths, String searchPattern)
    {
        //get all files in current directory that match the pattern
        String[] filePathsInCurrentDir = Directory.GetFiles(pathToGetFilesIn, searchPattern);
        foreach (String fullPath in filePathsInCurrentDir)
        {
            fullFilePaths.Add(fullPath);
        }
    
        //call this method recursively for all directories
        String[] directories = Directory.GetDirectories(pathToGetFilesIn);
        foreach (String path in directories)
        {
            GetAllFilesMatchingPattern(path, ref fullFilePaths, searchPattern);
        }
    }
    

    【讨论】:

      【解决方案3】:
          public static IEnumerable<string> GetImages()
      {    
          //For each "*Image" directory
          foreach (var jobFolder in Directory.EnumerateDirectories(@"\\server\Scanner\images", "*Images"))
          {
              //For each first level subdirectory
              foreach (var jobSubFolder in Directory.EnumerateDirectories(jobFolder))
              {
                  //Enumerate each file containing a '_'
                  foreach (var filePath in Directory.EnumerateFiles(jobSubFolder, "*_*", SearchOption.TopDirectoryOnly))
                  {                               
                      yield return filePath;
                  }
              }
          }
      }
      

      仅枚举每个“*Image”目录的第一级子目录中的文件。

      最后你可以使用它:

      foreach (var path in GetImages())
                  {
                      Console.WriteLine(path);
                  }
      

      【讨论】:

      • 请鼓励使用msdn.microsoft.com/en-us/library/…,因为它效率更高,并且在必要时不会填充列表。
      • @MatthewBrubaker 你是对的!谢谢。将更新我的答案。
      • 这看起来不错,但这不是先获取文件系统中每个文件的列表,然后对其执行正则表达式匹配吗?我认为如果有与正则表达式不匹配的“顶级”目录会非常慢,但因为这与系统中的每个文件都匹配。 (当我更深入地过滤目录时,请参阅我的 OP 示例,等等。)
      • @SofaKng 它将尝试匹配在您的“图像”文件夹下找到的任何文件的正则表达式。如果您希望使用特定的图像格式,则可以将 . 替换为 *.jpg 并仅枚举 JPG 图像。
      【解决方案4】:

      有一个 C# 程序,您可以在其中使用 * 和 ? 等通配符按路径模式搜索文件夹。

      例如,如果路径模式 C:\Folder?*\Folder2 被传递给过程,那么将返回一个文件夹路径列表

      C:\Folder1\A\Folder2

      C:\FolderA\B\Folder2

      ...

      等等

      static List<string> GetFoldersByPathPattern(string folderPathPattern)
      {
          List<string> directories = new List<string>();
          directories.Add("");
      
          string[] folderParts = folderPathPattern.Split(new char[] { '\\' }, StringSplitOptions.None);
          foreach (string folderPart in folderParts)
          {
      
              if (folderPart.Contains('*') || folderPart.Contains('?'))
              {
                  List<string> newDirectories = new List<string>();
      
                  foreach (string directory in directories)
                  {
                      foreach (string newDirectory in Directory.GetDirectories(directory, folderPart))
                      {
                          newDirectories.Add(newDirectory);
                      }
                  }
      
                  directories = newDirectories;
              }
              else
              {
                  for (int i = 0; i < directories.Count(); i++)
                  {
                      directories[i] = directories[i] + folderPart + "\\";
                  }
              }
          }
      
          return directories;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-06
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        相关资源
        最近更新 更多