2009-06-12 14 views
9

Das heißt, löschen Sie alle Dateien passende Muster in einem bestimmten VerzeichnisWie löschen Sie Dateien, in einem Verzeichnis

Beispiel, löschen Sie alle mit * .jpg-Dateien in Verzeichnisname

+0

Sie einen regulären Ausdruck verwenden könnten. Mach ein wenig nach Pattern Matching, RegEx ist nicht meine Spezialität, aber sie sind mächtig wie die Hölle. –

+2

(Datei apis in der Regel nicht regexes, einfach nur Wildcards. Volle regex ist mehr etwas für Shells und Skriptsprachen) –

Antwort

22
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    DeleteFiles(ExtractFilePath(ParamStr(0)),'*.jpg'); 
end; 

procedure DeleteFiles(APath, AFileSpec: string); 
var 
    lSearchRec:TSearchRec; 
    lPath:string; 
begin 
    lPath := IncludeTrailingPathDelimiter(APath); 

    if FindFirst(lPath+AFileSpec,faAnyFile,lSearchRec) = 0 then 
    begin 
    try 
     repeat 
     SysUtils.DeleteFile(lPath+lSearchRec.Name);  
     until SysUtils.FindNext(lSearchRec) <> 0; 
    finally 
     SysUtils.FindClose(lSearchRec); // Free resources on successful find 
    end; 
    end; 
end; 
+0

(Es ist nicht notwendig, fillchar die lsearchrec) –

+0

Vielen Dank. Genau das suche ich. – volvox

+0

* Machen Sie immer einen FillChar, wenn Sie richtig programmieren wollen. Dies kann nichts tun, aber das ist eine gute Angewohnheit. Eines Tages, wenn du in C programmierst, wie ich es getan hast, wirst du in große Schwierigkeiten geraten, wenn du keine guten Gewohnheiten hast. Sie müssen * immer * annehmen, dass der Datensatz nicht initialisiert ist, und Sie sollten sich immer vorstellen, dass der Speicher möglicherweise nicht immer mit 0 Bytes belegt ist. Sie müssen die FillChar-Funktion wirklich zurückstellen, um anderen gute Gewohnheiten anstatt schlechten zu zeigen. –

5

Sie können die SHFileOperation passende Muster verwenden Funktion. Das Schöne an der Verwendung von SHFileOperation ist, dass Sie die Möglichkeit haben, die Dateien in den Papierkorb zu löschen, und Sie erhalten die normalen API-Animationen, damit der Benutzer weiß, was vor sich geht. Der Nachteil ist, dass das Löschen etwas länger dauert als Jeffs Code.

Es gibt mehrere Wrapper da draußen. Ich benutze diesen kostenlosen Wrapper von BP Software. Die gesamte Wrapper-Datei ist nur 220 Zeilen und ist leicht zu lesen und zu verwenden. Ich installiere das nicht als Komponente. Ich habe es einfacher gefunden, diese Einheit zu meinem Projekt hinzuzufügen und einfach das Objekt nach Bedarf zu erstellen und freizugeben.

Update: Der Download-Link für die BP Software-Site ist nicht mehr gültig. Es gibt eine older version on the Embarcadero website.

TSHFileOp (1.3.5.1) (3 KB)
Mai TComponent, die ein Wrapper ist für die SHFileOperation API zu kopieren, verschieben, umbenennen oder löschen (mit recycle-bin-Unterstützung) ein Dateisystem Objekt.

Der Dateiname-Parameter für SHFileOperation unterstützt Wildcards im MS-DOS-Stil. So können Sie die Komponente wie folgt verwenden:


     FileOps := TSHFileOp.Create(self); 

     FileOps.FileList.Add(DirectoryName + '\*.jpg'); 

     FileOps.HWNDHandle := self.Handle; 
     FileOps.Action := faDelete; 
     FileOps.SHOptions := 
      [ofAllowUndo, ofNoConfirmation, ofFilesOnly, ofSimpleProgress]; 
     FileOps.Execute; 

zeige ich in der Regel die „Sind Sie sicher“ -Meldung mich so immer ich die ofNoConfirmation Flagge passieren, damit Windows nicht wieder fragen.

Wenn Sie nicht jede jpg-Datei löschen oder aus mehreren Verzeichnissen löschen möchten, können Sie vor dem Aufruf von execute vollständige Dateinamen oder unterschiedliche Pfade mit Platzhaltern zur Liste der FileList-Zeichenfolgen hinzufügen.

Hier ist die MSDN Page for SHFileOperation
Beachten Sie, dass SHFileOperation von IFileOperation beginnend mit Windows Vista ersetzt wurde. Ich habe weiterhin SHFileOperation unter Windows Vista ohne Probleme verwendet.

+0

Vielen Dank diese andere faire Lösung und doc - ich habe es mit dem TSHFileOp Wrapper versucht. – volvox

+0

Link ist tot ... – kobik

4

In neueren Versionen von Delphi, würden Sie wahrscheinlich die Klassen in System.IOUtils verwenden, die im Wesentlichen FindFirst, FindNext etc wickeln:

procedure DeleteFilesMatchingPattern(const Directory, Pattern: string); 
    var FileName: string; 
begin 
    for FileName in TDirectory.GetFiles(Directory, Pattern) do TFile.Delete(FileName); 
end; 
Verwandte Themen