2016-08-17 3 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», поэтому я думал, что было бы лучше использовать маску в SearchPath так:

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

Но это Безразлично» т работы. Есть ли способ сделать это?

+0

Конечно, начните жить, и для каждого каталога, если Тереза ​​Н. extobjects, посмотрите там .. – BugFinder

+0

Возможного дубликат [Как сканировать папку с групповым символом с конкретным подкаталогом] (HTTP: // StackOverflow .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, вы могли бы оптимизировать следующий Еогеасп петлю в запрос LINQ, если ваша цель .NET поддерживает его.

 // 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 
      } 
     } 
Смежные вопросы