2009-01-13 19 views
19

ho bisogno di cercare un drive (C :, D: ecc) per un tipo di file partuicular (estensione come .xml, .csv, .xls). Come faccio a preformare una ricerca ricorsiva per rompere tutte le directory e le directory interne e restituire il percorso completo di dove sono i file? o dove posso ottenere informazioni su questo?ricorsive file Cerca in .net

VB.NET o C#

Grazie

Edit ~ Sono in esecuzione in alcuni errori, come in grado di accedere al sistema di accesso al volume negato di ecc Qualcuno sa dove posso vedere qualche codice smaple sull'implementazione di un file ricerca? Ho solo bisogno di cercare un'unità selezionata e restituire il percorso completo del tipo di file per tutti i file trovati.

risposta

20

Che ne dici di questo? Evita l'eccezione spesso generata dalla ricerca ricorsiva in-built (per esempio, si ottiene l'accesso negato a una singola cartella, e tutta la ricerca muore), e viene pigramente valutati (vale a dire che restituisce i risultati non appena li trova, piuttosto che buffering 2000 risultati). Il comportamento pigro consente di creare interfacce utente reattive, ecc. E funziona anche con LINQ (in particolare First(), Take(), ecc.).

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

Hmm ... ho appena ottenuto un downvote inaspettato - ti interessa spiegare perché? –

+1

Forse è l'uso di "catch {}". Non intendo offendere, ma è una pratica abbastanza negativa. Meglio prendere l'AccessDeniedException o DirectoryNotFoudnException, o qualsiasi altra cosa ... HTH – JamieH

+0

Grazie Marc. È fantastico. –

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

Esattamente quello che volevo. Semplice e funziona. – NMunro

5

Sembra che la biblioteca recls - sta per rec ursive ls - ora ha un pure .NET implementation. Ho appena read about it in Dr Dobb's.

sarebbe stato utilizzato come:

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