VBA Tipp: Datei löschen

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Löschen einer oder mehrerer Dateien.

  • Lösung 1: Eine oder mehrere Dateien löschen mit der VBA Kill-Anweisung
  • Lösung 2: Eine Datei mittels FileSystemObject löschen
  • Lösung 3: Eine oder mehrere Dateien, einen Ordner löschen bzw. in den Papierkorb verschieben. (Anwendung der API-Funktion SHFileOperation)

Lösung 1

Das geht mit der VBA-Anweisung Kill.

   ' Eine Datei löschen
   On Error Resume Next
   Kill "D:\einVerzeichnis\eineDatei.txt"
   ' Alle txt-Dateien in einem Ordner löschen.
   On Error Resume Next
   Kill "C:\einVerzeichnis\*.txt"
   ' Alle Dateien in einem Ordner löschen; Dateien in Unterordnern werden nicht gelöscht.
   On Error Resume Next
   Kill "C:\einVerzeichnis\*.*"

Lösung 2

Das geht mit dem FileSystemObject.

   ' Eine Datei löschen
   On Error Resume Next
   CreateObject("Scripting.FileSystemObject").DeleteFile "C:\einVerzeichnis\test.txt"

Hinweis zu den Codes

On Error Resume Next verhindert das Auslösen eines Laufzeitfehlers wegen nicht vorhandener Datei, fehlender Löschberechtigung, usw..

Lösung 3

Das geht mit folgender API-Deklaration und VBA-Funktion, die in einem globalen Modul hinterlegt werden.

Private Type SHFILEOPSTRUCT
   hWnd                  As Long     ' HWND            hwnd
   wFunc                 As Long     ' UINT            wFunc
   pFrom                 As String   ' LPCSTR          pFrom
   pTo                   As String   ' LPCCSTR         pTo
   fFlags                As Integer  ' FILEOP_FLAGS    fFlags
   fAnyOperationsAborted As Long     ' BOOL            fAnyOperationsAborted
   hNameMappings         As Long     ' LPVOID          hNameMappings
   lpszProgressTitle     As String   ' LPCCSTR         lpszProgressTitle // only used if FOF_SIMPLEPROGRESS
End Type
 
' Konstanten für wFunc
Private Const FO_DELETE          As Long = &H3   ' Dateien löschen
 
' Konstanten für fFlags
Private Const FOF_NOCONFIRMATION As Long = &H10  ' Keine Bestätigungen anfordern
Private Const FOF_ALLOWUNDO      As Long = &H40  ' in Papierkorb verschieben
Private Const FOF_FILESONLY      As Long = &H80  ' bei WildCards *.* nur auf Dateien beziehen
 
Private Declare Function SHFileOperation Lib "shell32.dll" _
   Alias "SHFileOperationA" ( _
   lpFileOp As SHFILEOPSTRUCT) As Long
 
Public Function DateiLoeschen(Dateipfade As String, _
                              Optional ByVal InPapierkorb As Boolean, _
                              Optional ByVal MitRueckfrage As Boolean, _
                              Optional ByVal MitUnterordnern As Boolean) As Boolean
 
   ' Quelle: http://www.dbwiki.net/
 
   Dim fo As SHFILEOPSTRUCT
 
   ' Datei löschen
   fo.wFunc = FO_DELETE
 
   fo.pFrom = Dateipfade
   ' ggf. Chr$(0) anfügen
   If Right$(fo.pFrom, 1) <> vbNullChar Then
      fo.pFrom = fo.pFrom & vbNullChar
   End If 
 
   ' in Papierkorb verschieben?
   If InPapierkorb = True Then
      fo.fFlags = FOF_ALLOWUNDO
   End If
 
   ' mit Rückfrage?
   If Not MitRückfrage Then
      fo.fFlags = fo.fFlags Or FOF_NOCONFIRMATION
   End If
 
   ' mit Unterordnern (bei Angabe von \*.*)?
   If Not MitUnterordnern Then
      fo.fFlags = fo.fFlags Or FOF_FILESONLY
   End If
 
   DateiLoeschen = Not CBool(SHFileOperation(fo))
 
End Function

Aufruf Lösung 3

  • Für Dateinamen können die beiden Platzhalterzeichen [?*], wie z.B. *.* oder *.txt oder a??text*.p?? verwendet werden.
  • Mehrere Dateien werden mit dem Zeichen vbNullChar (entspricht Chr$(0)) verknüpft als ein einzelner String nach folgendem Muster zusammengefasst:
strPfad = Dateipfad1 & vbNullChar & Dateipfad2 & vbNullChar & Dateipfad3
   Dim strPfad As String
 
   ' Beispiel 1: Eine Datei löschen
   strPfad = "C:\einVerzeichnis\login.html"
   Call DateiLoeschen(strPfad)
 
   ' Beispiel 2: Einen Ordner in den Papierkorb verschieben
   strPfad = "C:\einVerzeichnis"
   Call DateiLoeschen(strPfad, True)
 
   ' Beispiel 3: Eine Datei mit Rückfrage in den Papierkorb verschieben
   strPfad = "C:\einVerzeichnis\Bedienungsanleitung.pdf"
   Call DateiLoeschen(strPfad, True, True)
 
   ' Beispiel 4: Zwei Dateien ohne Rückfrage in den Papierkorb verschieben
   ' Die Dateinamen werden mit dem Trennzeichen vbNullChar verkettet
   strPfad = "C:\einVerzeichnis\Bedienungsanleitung.pdf" & vbNullChar & _
             "C:\einAnderesVerzeichnis\Datenbank-Performance.pdf"
   Call DateiLoeschen(strPfad, True)
 
   ' Beispiel 5: Alle Dateien und Unterverzeichnisse eines Ordners ohne Rückfrage in den Papierkorb verschieben
   Call DateiLoeschen("C:\einVerzeichnis\*.*", True, False, True)

Wikilinks

Weblinks