Dateien und Verzeichnisse löschen
Folgende Funktion löscht sowohl Dateien als auch Verzeichnisse mitsamt allen Unterverzeichnissen.
Durch den Parameter fFlags kann das Verhalten der Funktion beeinflusst werden. Standardmäßig erfolgt keine Sicherheitsabfrage (FoF_NoConfirmation) und es wird kein Fortschritssdialog (FoF_Silent) angezeigt. Die Dateien werden nicht in den Papierkorb verschoben, sondern endgültig gelöscht.
Grundsätzlich wird die Windows-Funktion SHFileOperation wie folgt benutzt:
uses ShellAPI; function DeleteFiles(const AFile: string): boolean; var sh: SHFileOpStruct; begin ZeroMemory(@sh, SizeOf(sh)); with sh do begin Wnd := Application.Handle; wFunc := FO_DELETE; pFrom := PChar(AFile +#0); fFlags := FOF_SILENT or FOF_NOCONFIRMATION; end; result := SHFileOperation(sh) = 0; end;
Beispielaufruf:
procedure TForm1.Button1Click(Sender: TObject); begin if DeleteFiles('c:\test.txt') then //um eine Datei zu löschen ... if DeleteFiles('c:\test') then //um ein Verzeichnis zu löschen ... if DeleteFiles('c:\test\*.*') then // Um alle Dateien eines Verzeichnisses zu löschen ... end;
Statt ‚c:\test\*.*‘ kann z.B. auch ‚c:\test*.txt‘ übergeben werden, um alle Textdateien in einem Verzeichnis zu löschen.
Zu beachten ist, dass die Windows-Funktion SHFileOperation einen doppelt nullterminierten String für den Dateinamen erwartet. Deshalb hängt obiger Code #0 an AFile an.
Obiges Beispiel löscht die Dateien/Verzeichnisse ohne Anzeige des Windows-Fortschrittsdialogs und ohne Rückfrage. Die gelöschten Dateien landen auch nicht im Papierkorb. All das lässt sich aber über die Parameter, die bei fFlags angegeben sind, steuern. Folgende Parameter sind möglich (verbunden werden sie mit „or“):
FOF_ALLOWUNDO | Datei wird nicht komplett gelöscht, sondern in den Papierkorb verschoben. Funktioniert nur bei Angabe eines absoluten Dateipfads ohne Platzhalter. |
FOF_FILESONLY | Löscht bei Angabe des Platzhalters *.* nur Dateien, keine Verzeichnisse. |
FOF_NOCONFIRMATION | Löscht ohne Rückfrage |
FOF_NOERRORUI | Zeigt keine Fehlermeldung, wenn ein Fehler auftritt. |
FOF_NORECURSION | Löscht nur im angegebenen Verzeichnis, nicht in Unterverzeichnissen. Rekursives Löschen ist das Standardverhalten. |
FOF_SILENT | Zeigt keinen Fortschrittsbalken an. |