2012-12-11 20 views
5

Mi chiedevo quale sarebbe stato un buon modo per eseguire la scansione di una directory con caratteri di cui non si è sicuri.Come eseguire la scansione di una directory con carattere jolly con una sottodirectory specifica

Ad esempio, voglio eseguire la scansione

C:. \ Programmi \ Version2 * \ File

Significato

  • La cartella si trova nella C:\Program
  • Version2.* potrebbe essere qualsiasi cosa come Version2.33, Version2.1, ecc.
  • Quella cartella ha una cartella denominata Files in esso

So che avrei potuto fare qualcosa di simile foreach (directory) if contains("Version2."), ma mi chiedevo se ci fosse un modo migliore di farlo.

+0

Hai provato la [funzione di Directory.GetFiles] (http://msdn.microsoft.com/en-us/library/wz42302f.aspx)? Non sono sicuro se ciò includerebbe diverse directory, ma ha '*' come carattere jolly – Default

+0

Possibile duplicato: http://stackoverflow.com/questions/7286477/possible-to-specify-directory-path-with-a- wildcard – Default

+0

@Default, la risposta è utile, quando carattere jolly alla fine del percorso, non nel mezzo come sembra essere in questa domanda. –

risposta

6

Directory.EnumerateDirectories accetta il modello di ricerca. Così enumerare genitore che ha caratteri jolly e di enumerare il resto:

var directories = 
    Directory.EnumerateDirectories(@"C:\Program\", "Version2.*") 
    .SelectMany(parent => Directory.EnumerateDirectories(parent,"Files")) 

Nota: se il percorso può contenere caratteri jolly a qualsiasi livello - è sufficiente normalizzare percorso e raggruppati per "\", di raccogliere le cartelle di livello per livello.

+0

C'è un motivo per usare EnumerateDirectories invece di GetDirectories? – Default

+2

@Default EnumerateDirectories utilizza la valutazione lazy, quindi potrebbe essere più veloce per un numero elevato di file/cartelle (consultare la sezione dei commenti su MSDN [collegamento] (http://msdn.microsoft.com/en-us/library/dd383572 (v = vs .100) .aspx)) –

+0

Questo sembra adattarsi al meglio a quello che sto cercando attualmente (: Proverò a provare presto Grazie! –

1

Prova questo

var pattern = new Regex(@"C:\\Program\\Version 2(.*)\\Files(.*)"); 

var directories = Directory.EnumerateDirectories(@"C:\Program", "*", 
               SearchOption.AllDirectories) 
               .Where(d => pattern.IsMatch(d)); 
+0

+1. Può funzionare, ma è probabile che trovi un modo in più directoies - richiederà ulteriori filtraggio più tardi –

+0

Hai ragione, naturalmente, aggiunto il filtro alla mia risposta –

Problemi correlati