[vb.net & VBA & VB6] Datei löschen
Gepostet am: Mar 22, 2011 10:3:9 AM
Immer wieder werde ich mit der Frage konfrontiert, wie man denn Dateien in den unterschiedlichen VB-Programmiersprachen löscht. Interessant wie etwas so Elementares zu solchen Problemen führen kann. Vorerst mal zur Übersicht: (welche Methoden stehen in welcher Programmiersprache zur Verfügung)
FileSystemobject (VBA, VBS, VB6, [VB.net])
FSO in VB6
Public Function DateiLoeschen(strPath As String) As Boolean Dim fso As New FileSystemObject Dim oFile As File Set fso = CreateObject("Scripting.FileSystemObject") If fso.fileexists(strPath) Then Set oFile = fso.getFile(strPath) oFile.Delete() If fso.fileexists(strPath) Then Return False Else Return True End If Else Return True End IfEnd Function
Zu meiner eigenen Überraschung habe ich auch das FileSystemObject unter VB.Net zum Laufen gebracht:
FSO in VB.net
Public Function DateiLoeschen4(ByVal strPath As String) As Boolean Dim fso As New Object Dim oFile As Object fso = CreateObject("Scripting.FileSystemObject") If fso.fileexists(strPath) Then oFile = fso.getFile(strPath) oFile.Delete() If fso.fileexists(strPath) Then Return False Else Return True End If Else Return True End If End Function
Kill (VBA, VB.Net, VB6, VBS)
Kill
Public Function DateiLoeschen2(ByVal strPfad As String) As Boolean On Error Resume Next If Len(Dir$(strPfad)) > 0 Then 'prüfen ob die Datei existiert SetAttr(strPfad, vbNormal) Kill(strPfad) If Len(Dir$(strPfad)) > 0 Then Return False 'Rückmelden, dass die Datei nicht gelöscht wurde Else Return True 'Rückmelden, dass die Datei gelöscht wurde End If Else Return True 'Rückmelden, dass die Datei nicht existiert End If End Function
Für schreibgeschützte Dateien oder versteckte Dateien findet man hier eine Lösung.
Eine Alternative mit erweiterter Funktionalität (Papierkorb, schreddern) findet man hier. Eine Methode, die angeblich die Wiederherstellung der Datei nicht zulässt, findet man hier.
File.IO (VB.Net) mit Recycle Bin (Papierkorb)
File.IO
Public Function Dateiloeschen3(ByVal strPfad As String) As Boolean On Error Resume Next If FileIO.FileSystem.FileExists(strPfad) = True Then FileIO.FileSystem.DeleteFile(strPfad, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) If FileIO.FileSystem.FileExists(strPfad) = True Then Return False Else Return True End If Else Return True End If End Function
System.IO (VB.Net)
System.IO
Public Function DateiLoeschen(ByVal strPfad As String) As Boolean On Error Resume Next If System.IO.File.Exists(strPfad) = True Then 'Prüfen, ob die Datei existiert System.IO.File.Delete(strPfad) If System.IO.File.Exists(strPfad) = True Then Return False 'Rückmelden, dass die Datei nicht gelöscht wurde Else Return True 'Rückmelden, dass die Datei gelöscht wurde End If Else Return True 'Rückmelden, dass die Datei nicht existiert End If End Function
Harte Möglichkeit (mit Recycle Bin, Papierkorb) (VB.net, VBA, VB6)
Wenn man beispielsweise in VBA eine Datei in den Papierkorb verschieben möchte, kommt man an dieser Möglichkeit nicht vorbei. Hierbei benutzt man die Win32 API SHFileOperation. [weitere Informationen hier oder hier] Achtung: in VBS sind keine API-Calls möglich.
mittels API
' **********************************************************************' Modul: Modul1 Typ: Allgemeines Modul' **********************************************************************Option ExplicitPrivate Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" ( _ ByRef lpFileOp As SHFILEOPSTRUCT) As LongPrivate Type SHFILEOPSTRUCT hWnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As StringEnd Type Private Const FO_MOVE = &H1&Private Const FO_COPY = &H2&Private Const FO_DELETE = &H3&Private Const FO_RENAME = &H4&Private Const FOF_MULTIDESTFILES = &H1&Private Const FOF_CONFIRMMOUSE = &H2&Private Const FOF_SILENT = &H4&Private Const FOF_RENAMEONCOLLISION = &H8&Private Const FOF_NOCONFIRMATION = &H10&Private Const FOF_ALLOWUNDO = &H40&Private Const FOF_FILESONLY = &H80&Private Const FOF_SIMPLEPROGRESS = &H100&Private Const FOF_NOCONFIRMMKDIR = &H200&Private Const FOF_NOERRORUI = &H400&Private Const FOF_NOCOPYSECURITYATTRIBS = &H800&Public Sub Move_to_Recycling_Bin(strFilename As String) Dim udtFileStructure As SHFILEOPSTRUCT With udtFileStructure .wFunc = FO_DELETE .pFrom = strFilename .fFlags = FOF_ALLOWUNDO End With SHFileOperation udtFileStructure End Sub
API Funktion DeleteFile
API DeleteFile
Private Declare Function DeleteFile Lib "kernel32.dll" _ Alias "DeleteFileA" ( _ ByVal lpFileName As String) As Long Private Function DateiLoeschen(ByVal strPath As String) As Boolean On Error Resume Next If Len(Dir$(strPath)) > 0 Then 'prüfen ob die Datei existiert If (DeleteFile(strPath) = 0) Then Return False 'Rückmelden, dass die Datei nicht gelöscht wurde Else Return True 'Rückmelden, dass die Datei gelöscht wurde End If Else Return True 'Rückmelden, dass die Datei nicht existiert End If End Function
weiterführende Informationen
Dateien schreddern (ob die Wiederherstellungsmöglichkeiten dadurch wirklich nicht gegeben sind, bezweifle ich, habe ich aber auch nicht ausführlich getestet)
FAQ 0002: Wie kann ich eine Datei oder einen Ordner löschen? (VB6)
FileSysteObject
System.IO