|
|
|
|
|
Eine Datei zu löschen ist in Visual Basic ein Kinderspiel - zum
Beispiel:
Kill "c:\autoexec.bat"
- und schon ist die Datei weg und unrettbar verloren.
Vor allem bei vom Anwender ausgelösten Dateilöschungen sollten
Sie ihm daher die Windows-übliche Möglichkeit einräumen,
gelöschte Dateien (und Ordner) aus dem Papierkorb wieder
herzustellen zu können. Verwenden Sie in solchen Fällen die
API-Funktion SHFileOperation.
Bei dieser können Sie wählen, ob die Datei(en) im Papierkorb
landen, oder ob sie wie bei der VB- Kill-Anweisung
gleich vollständig gelöscht werden. Außerdem können Sie die
gewohnte Fortschrittsanzeige bieten und einige Einstellungen mehr
festlegen ( SHFILEOPSTRUCT).
Ebenso können Sie mit ihr komplette Ordner auf einen Schlag
löschen - ein komplizierter, rekursiver Mechanismus mit den
VB-Anweisungen Kill und RmDir
entfällt, mit dem alle untergeordneten Ordner geleert und einzeln
gelöscht werden müssten.
Die hier vorgestellte Ersatzfunktion Kill verhält sich wie das
VB-Original, wenn Sie ihr (wie gewohnt) lediglich den gewünschten
Dateinamen übergeben. Sie können ihr aber auch ein
(dimensioniertes oder aktuell mit der Array-Funktion
zusammengestelltes) Array oder eine Collection
aus einzelnen Datei- und Ordnerpfaden übergeben. Und sie können
Wildcards (etwa "*.*" oder "*.bas")
verwenden.
Die gewünschte Funktionalität legen Sie in den einzelnen
optionalen Parametern fest. Sollen die Dateien in den Papierkorb
verschoben werden, setzen Sie AllowUndo gleich True. Soll der
Windows-übliche Fortschrittsdialog mit Möglichkeit zum Abbrechen
des Vorgangs angezeigt werden, setzen Sie ShowProgress gleich True.
Die Rückfrage, ob wirklich gelöscht werden soll, legen Sie mit
Confirmation gleich True fest. Eine etwas vereinfachte
Fortschrittsanzeige, bei der die Anzeige der gerade bearbeiteten
Dateinamen unterbleibt, wählen Sie mit Simple gleich True. Wenn Sie
im Falle eines Fehlers die Windows-Anzeige dieses Fehlers
beibehalten wollen, setzen Sie SysErrors gleich True.
Unabhängig davon, wie Sie den letztgenannten Parameter setzen,
gibt die Funktion Kill den Wert True zurück, wenn ein Fehler
aufgetreten ist. Allerdings lässt sich der Fehler nicht näher
spezifizieren - Sie müssen auf andere Weise prüfen, was schief
gegangen sein könnte (Datei nicht vorhanden, gesperrt u.a.). Hat
der Anwender bei den gelegentlichen Rückfragen des Systems
(Löschen einer Systemdatei o.ä.) beispielsweise einzelne Dateien
übersprungen, können Sie diese Information über den Parameter
UserAborts erhalten, in der Sie dazu eine Variable übergeben
müssen. Allerdings müssen Sie auch hierbei wieder selbst
herausfinden, welche Dateien übersprungen worden sind.
Das Visual Basic-Original der Kill-Anweisung können Sie anstelle
dieser erweiterten Kill-Funktion weiterhin jederzeit aufrufen. Dazu
setzen Sie einfach den Herkunftsbezeichner (Qualifizierer) davor: "VBA.Kill
...".
Private 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 String
End Type
Private Declare Function SHFileOperation Lib "Shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Public Function Kill(Files As Variant, _
Optional ByVal AllowUndo As Boolean, _
Optional ByVal ShowProgress As Boolean, _
Optional ByVal Confirmation As Boolean, _
Optional ByVal Simple As Boolean, _
Optional ByVal SysErrors As Boolean, _
Optional ByVal hWnd As Long, _
Optional UserAborts As Variant _
) As Boolean
Dim l As Long
Dim nFileOperations As SHFILEOPSTRUCT
Const FO_DELETE = &H3
Const FOF_ALLOWUNDO = &H40
Const FOF_SILENT = &H4
Const FOF_NOCONFIRMATION = &H10
Const FOF_SIMPLEPROGRESS = &H100
Const FOF_NOERRORUI = &H400
With nFileOperations
If IsArray(Files) Then
For l = LBound(Files) To UBound(Files)
.pFrom = .pFrom & Files(l) & vbNullChar
Next 'l
.pFrom = .pFrom & vbNullChar
ElseIf VarType(Files) = vbObject Then
If TypeOf Files Is Collection Then
For l = 1 To Files.Count
.pFrom = .pFrom & Files(l) & vbNullChar
Next 'l
.pFrom = .pFrom & vbNullChar
End If
ElseIf VarType(Files) = vbString Then
.pFrom = Files
If Right$(.pFrom, 1) <> vbNullChar Then
.pFrom = .pFrom & vbNullChar
End If
If Mid$(.pFrom, Len(.pFrom) - 1, 1) <> vbNullChar Then
.pFrom = .pFrom & vbNullChar
End If
End If
If AllowUndo Then
.fFlags = FOF_ALLOWUNDO
End If
If Not ShowProgress Then
.fFlags = .fFlags Or FOF_SILENT
End If
If Not Confirmation Then
.fFlags = .fFlags Or FOF_NOCONFIRMATION
End If
If Simple Then
.fFlags = .fFlags Or FOF_SIMPLEPROGRESS
End If
If Not SysErrors Then
.fFlags = .fFlags Or FOF_NOERRORUI
End If
.wFunc = FO_DELETE
.hWnd = hWnd
Kill = Not CBool(SHFileOperation(nFileOperations))
If Not IsMissing(UserAborts) Then
UserAborts = CBool(.fAnyOperationsAborted)
End If
End With
End Function
 |
Mit der erweiterten Ersatzfunktion Kill
können Sie Dateien in den Papierkorb verschieben, wie im
Explorer Fortschrittsdialoge anzeigen und mehr

|

|
|
|