2011-01-05 11 views
0

Ich versuche, mehrere Filter mit dem Befehl Directory.GetFiles() zu verwenden.Mehrere Filter mit Directory.GetFiles?

Also sagen, ich möchte sowohl .html und .css-Dateien übereinstimmen. Ich verwende diese:

Directory.GetFiles(path,"*.html|*.css"); 

Ich sehe keine Dokumentation jedoch, dass dies unterstützt wird, und es endet nicht passende HTML- oder CSS-Dateien. Gibt es etwas, das mir fehlt?

+0

@Saeed leid, das war nur ein Tippfehler in meiner Frage. Es war ein Punkt in meinem Quellcode. – Earlz

Antwort

3

Die Directory.GetFiles Funktion nicht mehrere Filter unterstützt. Meine Lösung:

string patter = "*.jpg|*.png|*.gif"; 
string[] filters = patter.Split('|'); 
foreach(string filter in filters) 
{ 
    // call Directory.GetFiles(path, filter) here; 
} 
+0

Es ist sehr ineffizient. Rufen Sie Directory.GetFiles (Pfad) einmal auf, und filtern Sie Ergebnisse mit LINQ oder ähnlichem – ppiotrowicz

+2

@ppiotrowicz: Wie ist das ineffizient? Wenn Sie den LINQ-Ansatz verwenden, müssen Sie die Liste aller Dateien im Verzeichnis abrufen. Dies kann eine sehr lange Liste sein. Mit diesem Ansatz erhalten Sie nur die relevanten Einträge. –

+1

@rune es hängt davon ab, wenn GetFiles wegen nativer Win32-Aufrufe langsam ist, kann es einfach schneller sein, nur um eine Liste aller Dateien zu erhalten und es im Speicher zu filtern. Es erfordert jedoch Profiling, um sicher zu sehen, was schneller ist. –

1

Es gibt auch einen Abstieg Lösung, die foreach-Schleife vermeidet (mit Hilfe von Linq):

string[] filters = new[]{"*.jpg", "*.png", "*.gif"}; 
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();