2009-01-13 2 views
19

Мне нужно найти диск (C :, D: etc) для типа частичного файла (расширение, например .xml, .csv, .xls). Как создать предварительный поиск рекурсивного поиска для всех каталогов и внутренних каталогов и вернуть полный путь туда, где находятся файлы? или где я могу получить информацию об этом?Рекурсивный поиск файлов в .net

VB.NET или C#

Благодаря

Редактировать ~ Я бег в некоторые ошибки, как не в состоянии получить доступ к системе доступа к громкости отрицала и т.д. Кто-нибудь знает, где я могу увидеть некоторый smaple кода на реализацию файла поиск? Мне просто нужно найти выбранный диск и вернуть полный путь к типу файла для всех найденных файлов.

ответ

20

Как насчет этого? Это позволяет избежать исключения, часто возникающего в результате встроенного рекурсивного поиска (т. Е. Вы получаете отказ в доступе к одной папке, а весь ваш поиск умирает) и лениво оценивается (т. Е. Возвращает результаты, как только они их обнаруживают, а не буферизация результатов 2000 года). Ленивое поведение позволяет создавать гибкие пользовательские интерфейсы и т. Д., А также хорошо работает с LINQ (особенно First(), Take() и т. Д.).

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach (string match in Search("c:\\", "*.xml")) { 
      Console.WriteLine(match); 
     } 
    } 
    static IEnumerable<string> Search(string root, string searchPattern) { 
     Queue<string> dirs = new Queue<string>(); 
     dirs.Enqueue(root); 
     while (dirs.Count > 0) { 
      string dir = dirs.Dequeue(); 

      // files 
      string[] paths = null; 
      try { 
       paths = Directory.GetFiles(dir, searchPattern); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string file in paths) { 
        yield return file; 
       } 
      } 

      // sub-directories 
      paths = null; 
      try { 
       paths = Directory.GetDirectories(dir); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string subDir in paths) { 
        dirs.Enqueue(subDir); 
       } 
      } 
     } 
    } 
} 
+0

Хм ... только что получил нисходящий сигнал из-за синего - позаботьтесь, чтобы объяснить, почему? –

+1

Возможно, это использование «catch {}». Я не хочу оскорблять, но это довольно плохая практика. Лучше поймать AccessDeniedException или DirectoryNotFoudnException или что угодно ... HTH – JamieH

+0

Спасибо Marc. Это круто. –

52
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories); 
+0

Именно то, что я хотел. Простой и работает. – NMunro

5

Похоже recls библиотека - стенды для гее ursive Ls - теперь имеет pure .NET implementation. Я просто read about it in Dr Dobb's.

бы быть использованы в качестве:

using Recls; 
using System; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) { 
      Console.WriteLine(e.Path); 
     } 
    } 
Смежные вопросы