2012-11-09 14 views
41

Gibt es eine Möglichkeit, diese linq Ausdruck zu vereinfachen, oder gibt es eine bessere Möglichkeit, dies zu tun?Directory.GetFiles bestimmter Erweiterung

Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories) 
     .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || 
        s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) || 
        s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) || 
        ...); 

Grundsätzlich möchte ich alle Dateien einer bestimmten Erweiterung zurückgeben. Leider ist diese Methode nicht sehr flexibel. Ich wäre eher in der Lage, Erweiterungen zu einer Liste hinzuzufügen und Directory.GetFiles diese Erweiterungen zurückgeben. Ist das möglich?

+1

Doppelte Verwendung getan: http://stackoverflow.com/questions/163162/can-you-call-directory-getfiles-with-multiple-filters –

Antwort

68

Wenn Sie Ihre Filterung in LINQ tun möchte , können Sie es wie folgt tun:

var ext = new List<string> {"jpg", "gif", "png"}; 
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories) 
    .Where(s => ext.Contains(Path.GetExtension(s))); 

Jetzt ext eine Liste der erlaubten Erweiterungen enthält; Sie können Elemente hinzufügen oder entfernen, wenn dies für eine flexible Filterung erforderlich ist.

+0

Ich kann Tests durchführen, aber wissen Sie, welche wäre effizienter? – XSL

+0

Interessant, dass es funktioniert ... Aus der Dokumentation zu 'GetFiles' scheint es, als akzeptiere es' '' nicht so, wie man es von einem Regex erwartet. Die Dokumentation sagt, es erkennt nur '*' und '?', Aber hey, wenn es funktioniert, funktioniert es =) –

+0

Hinweis: Dies scheint nicht auf Win7 x64 mit .NET 4.5 zu arbeiten. Wirft "ungültige Zeichen im Pfad" aufgrund der Pipe. –

10

Überträgt die Directory.GetFiles(String, String) Überlastung das schon? Sie würden nur tun Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)

Wenn Sie sie in eine Liste einfügen möchten, dann ersetzen Sie einfach die "*.jpg" mit einer Variablen, die über eine Liste iteriert und die Ergebnisse in eine Gesamtergebnismenge aggregieren. Viel klarer, als sie einzeln zu spezifizieren. =)

So etwas wie ...

foreach(String fileExtension in extensionList){ 
    foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){ 
     allFiles.Add(file); 
    } 
} 

(Wenn Ihre Verzeichnisse sind groß, EnumerateFiles statt GetFiles mit potenziell effizienter sein können)

+0

Dank . Ich mag die Idee, aber ich bin mir nicht sicher, wie effizient es wäre, GetFiles viele Male in einer Schleife aufzurufen. – XSL

+0

Siehe den zusätzlichen Kommentar zur EnumerateFiles-Methode. –

+0

Danke für den Vorschlag, aber es scheint, EnumerateFiles ist nur für .net 4 verfügbar, aber ich muss 3.5 verwenden. Meine Schuld, dass ich das vorher nicht erwähnt habe, tut mir leid. – XSL

4

Ich hätte nur einzelne Zeile wie

List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories) 
     .Where(file => new string[] { ".jpg", ".gif", ".png" } 
     .Contains(Path.GetExtension(file))) 
     .ToList(); 
Verwandte Themen