2010-12-12 16 views
5

Używam Directory.GetFiles() do wypisywania plików według podanego wzorca. Działa to dobrze dla większości wzorców, których szukam (np. Zip, rar, sfv).Wzorzec Directory.GetFiles() pasuje w C#

Tak przygotowuję listę (mniej więcej). Problem polega na wzorze liczb od .001 do .999, który chcę wyświetlić.

alArrayPatternText.Add("*.zip"); 
alArrayPatternText.Add("*.sfv"); 
alArrayPatternText.Add("*.r??"); 
alArrayPatternText.Add("*.001"); 
for (int i = 2; i <= 999; i++) 
{ 
    string findNumber = String.Format("{0:000}", i); 
    alArrayPatternText.Add("*." + findNumber); 
} 

I wtedy zadzwonić

string[] files = Directory.GetFiles(strDirName, varPattern); 

dla każdego wzoru w tablicy, która wydaje się bardzo zły pomysł, aby to zrobić, ponieważ lista zawiera 1002 haseł i sprawdzenie czy katalog ma każdy z nich jest tylko trochę zbyt czasochłonne.

Czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

5

Należy wywołać Directory.EnumerateFiles("path", "*"), a następnie użyć LINQ do filtrowania ścieżek, wywołując Path.GetExtension.

Na przykład:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { 
    ".zip", ".sfv" 
}; 
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000"))); 
var files = Directory.EnumerateFiles("path", "*") 
      .Where(p => extensions.Contains(Path.GetExtension(p)) 
        || Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase)); 
+0

Dzięki, że powinien to zrobić :-) – MadBoy

+0

Hrmms, nie wydaje się być czymś źle, 000-999 nie ładnie się konwertuje. Pokazuje 1000 000 itd., A nawet ty masz pliki zip, a 001 nic nie zwraca dla plików ..:/ – MadBoy

+0

Prawdopodobnie problem z formatem ciągów. Spróbuj zastąpić: i => i.ToString (". 000") za pomocą: i => "." + i –

0

Moja ostatnia metoda oparta na SLaks odpowiedzieć każdemu, kto szuka podobnego rozwiązania

private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) { 
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" }; 
    extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i))); 
    extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i))); 
    extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i))); 
    extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i))); 
    return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList(); 
} 
Powiązane problemy