Home » Tipps & Tricks » Dateien/Verzeichnisse » Verzeichnisse » Dateien und Verzeichnisse löschen

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.