Löschen mehrerer Dateien mit Platzhalter

73

Sie wissen, dass es unter Linux einfach ist, aber ich kann nicht einfach verstehen, wie es in C # unter Windows geht. Ich möchte alle Dateien löschen, die dem Platzhalter entsprechen f*.txt. Wie gehe ich vor?

Zinken
quelle

Antworten:

137

Sie können die DirectoryInfo.EnumerateFilesFunktion verwenden :

var dir = new DirectoryInfo(directoryPath);

foreach (var file in dir.EnumerateFiles("f*.txt")) {
    file.Delete();
}

(Natürlich möchten Sie wahrscheinlich die Fehlerbehandlung hinzufügen.)

Ry-
quelle
Oder kürzer:dir.EnumerateFiles("f*.txt").ToList().ForEach(f => f.Delete());
jstuardo
2
@jstuardo: Erstellen einer Liste besiegt den Punkt der Umschaltung EnumerateFilesüber GetFiles.
Ry-
55

Ich weiß, dass dies bereits beantwortet wurde und mit einer guten Antwort, aber es gibt eine Alternative in .NET 4.0 und höher . Verwenden Sie Directory.EnumerateFiles()also:

foreach (string f in Directory.EnumerateFiles(myDirectory,"f*.txt"))
{
    File.Delete(f);
}

Der Nachteil von DirectoryInfo.GetFiles()ist, dass es eine Liste von Dateien zurückgibt - was in 99,9% der Fälle großartig ist. Der Nachteil ist, wenn der Ordner Zehntausende von Dateien enthält (was selten vorkommt), wird er sehr langsam und das Auflisten durch die übereinstimmenden Dateien ist viel schneller.

Brian Cryer
quelle
3
Beachten Sie, dass DirectoryInfohat EnumerateFiles()auch.
TrueWill
6
Falls sich jemand fragt, warum diese Antwort der akzeptierten Antwort so ähnlich ist, liegt dies daran, dass die akzeptierte Antwort im Lichte dieser Antwort neu geschrieben wurde. Das ist eine Schande, denn die Verwendung DirectoryInfo.GetFiles()(was die ursprüngliche Antwort war) ist die einzige Möglichkeit, dies für frühere Versionen von .NET zu tun.
Brian Cryer
1
Diese Antwort, Directory.EnumerateFiles (), ist immer noch schneller als die akzeptierte, da sie eine IEnumerable von Zeichenfolgen zurückgibt, anstatt FileInfo-Klassen, in denen auch alle anderen Eigenschaften ausgefüllt werden müssen. Wenn Sie vor oder nach dem Löschen etwas anderes mit den Dateiinformationen tun möchten, verwenden Sie DirectorInfo. Wenn Sie jedoch nur löschen, verwenden Sie Directory. In einem großen Verzeichnis wird es viel schneller sein.
Deano
8

Sie können die Directory.GetFiles- Methode mit der Platzhalterüberladung verwenden. Dadurch werden alle Dateinamen zurückgegeben, die Ihrem Muster entsprechen. Sie können diese Dateien dann löschen.

TastaturP
quelle
2

Ich schätze, dass dieser Thread jetzt ein bisschen alt ist, aber wenn Sie dann linq verwenden möchten

Directory.GetFiles("f:\\TestData", "*.zip", SearchOption.TopDirectoryOnly).ToList().ForEach(File.Delete);
s1cart3r
quelle