[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