Was ist die Syntax für die Einstellung mehrerer Dateierweiterungen wie searchPattern
auf Directory.GetFiles()
? Zum Beispiel das Herausfiltern von Dateien mit den Erweiterungen .aspx und .ascx .
// TODO: Set the string 'searchPattern' to only get files with
// the extension '.aspx' and '.ascx'.
var filteredFiles = Directory.GetFiles(path, searchPattern);
Update : LINQ ist keine Option , es muss searchPattern
übergeben werden GetFiles
, wie in der Frage angegeben.
c#
.net
system.io.directory
Seb Nilsson
quelle
quelle
Antworten:
Ich glaube, es gibt keine "out of the box" -Lösung, das ist eine Einschränkung der Directory.GetFiles-Methode.
Es ist jedoch ziemlich einfach, eine eigene Methode zu schreiben. Hier ist ein Beispiel .
Der Code könnte sein:
quelle
Bearbeiten 2014-07-23
Sie können dies in .NET 4.5 für eine schnellere Aufzählung tun:
Directory.EnumerateFiles in MSDN
quelle
GetFiles
kehrt zurückstring[]
.Directory.EnumerateFiles
für eine Leistungssteigerung ... stackoverflow.com/questions/5669617/…file.EndsWith("...", StringComparison.InvariantCultureIgnoreCase);
eher alsToLower
GetFiles kann nur mit einem einzelnen Muster übereinstimmen, aber Sie können Linq verwenden, um GetFiles mit mehreren Mustern aufzurufen:
Siehe den Kommentarbereich hier: http://www.codeproject.com/KB/aspnet/NET_DirectoryInfo.aspx
quelle
new string[]{"*.txt","filename.*"}
. Der Aufruf vonDistinct
löst dieses Problem jedoch nicht wirklich, da FileInfo-Objekte mit Referenzgleichheit und nicht mit semantischer Gleichheit verglichen werden. Es könnte behoben werden, indem entweder das entferntDistinct
oder es übergeben wirdIEqualityComparer<FileInfo>
. Bearbeitet, um das erstere zu tun.SelectMany
immer wieder über dieselbe Dateistruktur iteriert, so dass es in Bezug auf die Leistung möglicherweise nicht optimal ist.Ich mag diese Methode, weil sie lesbar ist und mehrere Iterationen des Verzeichnisses vermeidet:
quelle
HashSet<string>
Ich fürchte, Sie müssen so etwas tun, ich habe den regulären Ausdruck von hier aus mutiert .
quelle
Directory.EnumerateFiles
für eine Leistungssteigerung ( Was ist der Unterschied zwischen Directory.EnumerateFiles und Directory.GetFiles? )Oder es kann schneller sein, Ihre Globs zu teilen und zusammenzuführen (zumindest sieht es sauberer aus):
quelle
Die leicht zu merkende, faule und vielleicht unvollkommene Lösung:
quelle
Ich würde folgendes verwenden:
BEARBEITEN: Aufgrund von Nichtübereinstimmungen zwischen Directory und DirectoryInfo korrigiert
quelle
Eine effizientere Methode zum Abrufen von Dateien mit den Erweiterungen ".aspx" und ".ascx", bei der das Abfragen des Dateisystems nicht mehrmals und das Zurückgeben vieler unerwünschter Dateien vermieden wird, besteht darin, die Dateien mithilfe eines ungefähren Suchmusters und vorzufiltern um das Ergebnis anschließend zu verfeinern:
quelle
Ich würde versuchen, so etwas wie zu spezifizieren
es sollte funktionieren.
quelle
quelle
quelle
Anstelle der EndsWith-Funktion würde ich
Path.GetExtension()
stattdessen die Methode verwenden. Hier ist das vollständige Beispiel:oder:
(Verwenden
StringComparison.OrdinalIgnoreCase
Sie diese Option, wenn Sie Wert auf Leistung legen : MSDN-Zeichenfolgenvergleiche )quelle
sehen aus wie diese Demo:
quelle
Path.GetExtension
was Sie verwenden können.@ Daniel B, danke für den Vorschlag, meine eigene Version dieser Funktion zu schreiben. Es hat das gleiche Verhalten wie Directory.GetFiles, unterstützt jedoch die Regex-Filterung.
Ich fand es nützlich, also dachte ich, ich würde teilen.
quelle
c # -Version der Antwort von @ qfactor77. Dies ist der beste Weg ohne LINQ.
filePath
Geben Sie jetzt das String-Array zurück. Am Anfang brauchst duAußerdem müssen Sie einen Verweis auf hinzufügen
Microsoft.VisualBasic
quelle
Ich habe auf einfache Weise so viele Erweiterungen gesucht, wie Sie benötigen, und ohne ToLower (), RegEx, foreach ...
Arbeiten an .Net Standard 2.0.
quelle
Sie können es so machen
quelle
quelle
Ich möchte nur sagen, dass bei Verwendung von
FileIO.FileSystem.GetFiles
anstelleDirectory.GetFiles
eine Reihe von Platzhaltern zulässig ist.Beispielsweise:
quelle
FileIO
?