2010-04-01 20 views
5

Każdy przykład, który widzę, wydaje się być rekursywnie pobieranie plików w podkatalogach używa tylko plików. Próbuję przeszukać folder pod konkretny podkatalog o nazwie "xxx", a następnie zapisać tę ścieżkę do zmiennej, aby móc go używać do innych celów.C# Wyszukiwanie podkatalogu (nie dla plików)

Czy jest to możliwe bez przechodzenia przez wszystkie katalogi i porównywania według nazwy?

Odpowiedz

8

Dobrze

Directory.GetDirectories(root); 

zwróci Ci tablicę podkatalogów.

Następnie można użyć LINQ, aby znaleźć taki jesteś zainteresowany:

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

, który nie jest w pętli w kodzie, ale nadal jest pętla mimo wszystko. Ostateczna odpowiedź brzmi: "nie można znaleźć folderu" test "bez pętli".

Możesz dodać .SingleOrDefault() do Linq, ale to zależy od tego, co chciałeś zrobić, jeśli nie można znaleźć twojego "testowego" folderu.

Jeśli zmienisz wywołanie GetDirectories w celu włączenia funkcji wyszukiwaniaOdpowiedzi SearchOption.AllDirectories, wykona ona również rekursję dla Ciebie. Oczywiście w tym przypadku wywołanie może zwrócić więcej niż jeden element, jeśli w drzewie katalogów znajduje się więcej niż jeden folder o nazwie "test".

+1

+1 "To powinno zwrócić tylko jeden przedmiot." możesz to zrobić, dodając .SingleOrDefault() na końcu wyciągu :-) EDIT: a następnie oczywiście zwracając ciąg znaków. doh –

+0

@David - rzeczywiście, choć możesz nie chcieć niczego zwracać, jeśli nie można znaleźć podkatalogu podrzędnego. Zaktualizuję moją odpowiedź. – ChrisF

+0

@ChrisF, tak "..OrDefault "oznacza, że ​​null zostanie zwrócony, jeśli nie zostanie znaleziony pasujący element, chyba że straciłem subtelność w tym, co mówisz :-( –

0

Tak, wierzę, że jedynym dostępnym rozwiązaniem (krótka bibliotek zewnętrznych) jest rekurencyjna wyszukiwania dla katalogu poprzez porównanie nazwy.

1

Po pierwsze: "Nie, nie jest to możliwe bez przechodzenia przez wszystkie katalogi i porównywania według nazwy".

wierzę twoje prawdziwe pytanie brzmi: „Czy istnieje istniejących API, które będzie obsługiwać pętli przez wszystkich katalogów i porównywania wg nazwy dla mnie?”

Tak, istnieje. To się nazywa Directory.Exists():

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

ta zwróci tablicę ciągów ze wszystkich folderów znajdujących się w podanej nazwie. Ostatni parametr można zmienić tak, aby sprawdzał tylko katalogi najwyższego poziomu i można zmienić katalog główny, aby dostosować miejsce, z którego pochodzi.

0

Oto fragment o poszukiwaniu folderu za pomocą dwóch filtrów przy rozpatrywaniu dla UnauthorizedAccessException, może to być refactored do korzystania tylko jeden filtr: przykład

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

Zastosowanie:

Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\")); 
Powiązane problemy