2012-12-11 12 views
5

Zastanawiam się, jaki byłby dobry sposób na zeskanowanie katalogu zawierającego znaki, których nie jesteś pewien.Jak skanować katalog z symbolem wieloznacznym z określonym podkatalogiem?

Na przykład, chcę skanować

. C: \ Program \ Version2 * \ Files

Znaczenie

  • Folder znajduje się w C:\Program
  • Version2.* może być podobny do: Version2.33, Version2.1 itp.
  • tym folderze znajduje się folder o nazwie Files w nim

wiem, że mogę zrobić coś takiego foreach (directory) if contains("Version2."), ale zastanawiałem się, czy istnieje lepszy sposób robić to.

+0

Czy próbowałeś [FUNCTION Directory.GetFiles] (http://msdn.microsoft.com/en-us/library/wz42302f.aspx)? Nie jestem pewien, czy zawierałoby to kilka katalogów, ale ma '*' jako symbol wieloznaczny – Default

+0

Możliwy duplikat: http://stackoverflow.com/questions/7286477/possible-to-specify-directory-path-witha-a- wildcard – Default

+0

@Default, ta odpowiedź jest przydatna, gdy wildcard na końcu ścieżki, nie w środku, jak wydaje się być w tym pytaniu. –

Odpowiedz

6

Directory.EnumerateDirectories akceptuje wzór wyszukiwania. Tak wyliczać rodzica, który ma wieloznaczny i niż wyliczyć resztę:

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

Uwaga: Jeśli ścieżka może zawierać symbole wieloznaczne na każdym poziomie - po prostu znormalizować ścieżkę i podzielić przez „\”, niż zbierać poziom foldery poziomie.

+0

Czy jest jakiś powód, aby używać EnumerateDirectories zamiast GetDirectories? – Default

+2

@Default EnumerateDirectories używa leniwej oceny, więc może być szybszy w przypadku dużej liczby plików/folderów (sprawdź sekcję uwag w witrynie MSDN [link] (http://msdn.microsoft.com/en-us/library/dd383572 (v = vs .100) .aspx)) –

+0

Wydaje się najlepiej pasować do tego, czego aktualnie szukam (: Wkrótce spróbuję. Dzięki! –

1

Spróbuj

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

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

+1. Może pracować, ale prawdopodobnie znajdzie więcej kierunków - będzie wymagać dodatkowych filtrowanie później –

+0

Masz rację oczywiście, dodałeś filtrowanie do mojej odpowiedzi –

Powiązane problemy