2010-04-01 14 views
5

Ogni esempio che vedo sembra essere ricorsivo per ottenere file in sottodirectory che utilizzano solo file. Quello che sto cercando di fare è cercare una cartella per una particolare sottodirectory chiamata "xxx", quindi salvare quel percorso su una variabile in modo che io possa usarla per altre cose.C# Cerca sottodirectory (non per file)

Ciò è possibile senza eseguire il ciclo di tutte le directory e il confronto per nome?

risposta

8

Bene

Directory.GetDirectories(root); 

restituirà voi una serie di sottodirectory.

È quindi possibile utilizzare Linq per trovare quello che ti interessa:

IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test")); 

che non è un ciclo nel codice, ma è ancora un ciclo comunque. Quindi la risposta definitiva è che "no non è possibile trovare una cartella 'test' senza eseguire il loop".

È possibile aggiungere .SingleOrDefault() a Linq, ma ciò dipenderà da cosa si desidera eseguire se la cartella "test" non è stata trovata.

Se si modifica la chiamata GetDirectories per includere SearchOption SearchOption.AllDirectories, verrà eseguita anche la ricorsione. Ovviamente in questo caso la chiamata potrebbe restituire più di un elemento se c'era più di una cartella denominata "test" nell'albero delle directory.

+1

+1 "Questo dovrebbe restituire solo un articolo." potresti fare un contratto aggiungendo .SingleOrDefault() alla fine della tua istruzione :-) EDIT: e ovviamente restituendo una stringa. doh –

+0

@David - in effetti, anche se potresti non voler restituire nulla se non è possibile trovare la sottodirectory. Aggiornerò la mia risposta – ChrisF

+0

@ChrisF, sì il "..OrDefault "significa che null verrà restituito se non viene trovato alcun elemento corrispondente a meno che non mi sia sfuggita una sottigliezza in quello che stavi dicendo :-( –

0

Sì, credo che l'unica soluzione disponibile (a meno di librerie di terze parti) sia una ricerca ricorsiva per la directory tramite il confronto dei nomi.

1

Prima di tutto, "No, non è possibile senza scorrere tutte le directory e confrontarle per nome".

Credo che la tua vera domanda sia "Esiste un'API esistente che gestirà il looping di tutte le directory e il confronto per nome per me?"

Sì, c'è. Si chiama Directory.Exists():

var xxxPath = Path.Combine(parentFolder, "xxx"); 
if (Directory.Exists(xxxPath)) 
    savedPath = xxxPath; 
6
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories) 

Ciò restituirà una matrice di stringhe con tutte le cartelle trovati con il nome dato. È possibile modificare l'ultimo parametro in modo tale da controllare solo le directory di livello superiore e modificare la directory principale in base alla posizione da cui proviene.

0

Ecco un frammento per la ricerca di una cartella utilizzando due filtri, mentre considerando l'UnauthorizedAccessException, può essere riscritta per utilizzare un solo filtro: esempio

public static string FindGitPath(string firstFilter, string secondFilter, string initialPath) 
    { 
     string gitPath = string.Empty; 
     foreach (var i in Directory.GetDirectories(initialPath)) {   
      try { 
       foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) { 
        foreach (var s in Directory.GetDirectories(f)) { 
         if (s == Path.Combine(f,secondFilter)) { 
          gitPath = f; 
          break; 
         } 
        } 
       }  
      } catch (UnauthorizedAccessException) { 
       Console.WriteLine("Path is not accessible: {0}", i); 
      }        
     } 
     return gitPath; 
    } 

Usage:

Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\")); 
Problemi correlati