2016-08-17 111 views
-1

我在C#程序中遇到了一个奇怪的问题。 我有一些地方folderpaths像使用System.IO.Directory.GetFiles和路径中的通配符搜索

"C:\test\AB_Systems\ELEGANCE\CB-DOC\live\M7-091.249.99.XX.01\extobjects". 

现在我想搜索的PDF文件中被称为“extobjects”子文件夹。 不幸的是该文件夹中的许多子文件夹“活”,其中有一个叫“extobjects”子文件夹,所以我认为这将是更好的搜索路径一样,使用通配符:

"C:\test\AB_Systems\ELEGANCE\CB-DOC\live\*\extobjects" 

但是这并未”工作。 有没有办法做到这一点?

+0

当然,在启动现场,并为每个目录下,如果那里有一个extobjects,看看在那里.. – BugFinder

+0

的可能的复制[如何扫描通配符的目录与特定的子目录(HTTP://计算器.COM /问题/ 13815564 /如何对扫描一个目录,用通配符上带有一个特定的子目录中的) – Ultraviolet

回答

1
public static FileInfo[] findFile(String whereToSearch, String searchFor , String mode) 
    { 
     IEnumerable<FileInfo> files = null; 
     if (mode.Equals("")) 
      mode = "s"; 

     if (searchFor.Equals("")) 
      searchFor = "*"; 

     if (mode.Equals("r") || mode.Equals("recursive")) 
     { 
      DirectoryInfo dir = new DirectoryInfo(whereToSearch); 
      files = dir.EnumerateFiles(searchFor, searchOption: SearchOption.AllDirectories); 
     } 

     if (mode.Equals("s") || mode.Equals("specific")) 
     { 
      DirectoryInfo dir = new DirectoryInfo(whereToSearch); 
      files = dir.EnumerateFiles(searchFor, searchOption: SearchOption.TopDirectoryOnly); 
     } 

     if (files != null) return files.ToArray<FileInfo>(); 
     else return null; 
    } 

这是一个示例如何做到这一点。

重要的是要说只有文件名可以包含通配符模式,如*。路径可以作为从哪里开始搜索,并给出searchOption:searchOption.AllDirectories作为参数,它将通过入口路径的所有子目录。

您将收到一个FileInfo数组,其中包含路径和更多信息的对象。

0

您可以使用LINQ这样的:

var files = Directory 
    .EnumerateDirectories(@"C:\test\AB_Systems\ELEGANCE\CB-DOC\live", "extobjects", SearchOption.AllDirectories) 
    .SelectMany(x => Directory.EnumerateFiles(x, "*pdf", SearchOption.TopDirectoryOnly)) 
    .ToArray(); 
0

我会选择什么BugFinder提出一个解决方案,你可以,如果你的.NET目标支持它优化了以下的foreach循环到LINQ查询。

 // Itterate subdirectories of the live folder 
     foreach (var subDir in Directory.GetDirectories(@"C:\test\AB_Systems\ELEGANCE\CB-DOC\live")) 
     { 
      // Check if path to extobjects exists 
      var extObjects = Path.Combine(subDir, "extobjects"); 
      if (Directory.Exists(extObjects)) 
      { 
       var pdfFiles = Directory.GetFiles(extObjects, "*").Where(x=>x.EndsWith(".pdf")); 
       // Do something with the pdf file paths 
      } 
     }