Die Verwendung von
GetAllFiles
in unserem Testprogramm:
Dim dateien As String
...
Private Sub Befehl0_Click()
dateien = ""
GetAllFiles Text0.Value, Text1.Value
Text2.Value = dateien
End Sub
Die Shellfunktionen verwenden
WinAPI: SHFileOperation-Funktion, SHFILEOPSTRUCT-Struktur; IsMissing-Funktion;
Die Windows-Shell bzw. der Explorer stellen über die API-Schnittstelle die wohl jedem bekannten Dialoge
zum Kopieren, Verschieben, Umbenennen und Löschen von Dateien und Verzeichnissen zur Verfügung.
Abbildung 11.19 Dialog beim Kopieren von Dateien
Die Dateioperationen werden über die Funktion SHFileOperation abgewickelt. Optionen, Dateinamen etc.
übergeben Sie in einem Record mit folgendem Aufbau:
Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As Long
lpszProgressTitle As String
End Type
Die Parameter im Einzelnen:
Handle des übergeordneten Fensters (Ihre Anwendung)
Konstante für die Funktion (FO_MOVE, FO_COPY, FO_DELETE, FO_RENAME)
Quelle (ein oder mehrere nullterminierte Strings, die mit einem leeren String abgeschlossen werden)
Ziel (siehe Quelle)
Spezielle Optionen (siehe Online-Hilfe)
Rückgabe von True bei vorzeitigem Abbruch der Operation
737
Praxisbeispiele
Kapitel 11: Dateien und Verzeichnisse
Zeiger auf ein Array, mit dem überprüft werden kann, welche Dateien kopiert oder verschoben wurden
Titel für das Dialogfeld mit dem Fortschrittsbalken
Um die Funktionen möglichst einfach in ein Programm einbinden zu können, kapseln wir diese in einem
Klassenmodul.
Oberfläche
Für den Test der Dateioperationen benutzen wir ein Formular mit folgendem Aufbau:
Abbildung 11.20 Laufzeitansicht des Testformulars
Quelltext (Klassenmodul)
Erzeugen Sie ein neues Klassenmodul mit dem Namen FileOperation (Menü Einfügen/Klassenmodul des
VBA-Editors).
Neben der bereits oben beschriebenen Struktur
SHFILEOPSTRUCT
nehmen Sie noch folgende Konstanten
bzw. die API-Funktion
SHFileOperation
in den Deklarationsabschnitt auf:
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_WANTMAPPINGHANDLE = &H20
Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_FILESONLY = &H80
Private Const FOF_SIMPLEPROGRESS = &H100
Private Const FOF_NOCONFIRMMKDIR = &H200
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" _
(lpFileOp As SHFILEOPSTRUCT) As Long
Die Übergabewerte für die Kopierfunktion sind ein Array mit den Dateinamen, das Zielverzeichnis sowie eine
boolesche Variable, die bestimmt, ob auch Unterverzeichnisse kopiert werden sollen.
Public Sub Copy(dateinamen() As String, zielverzeichnis$, Optional inklUnterverzeichnisse)
Dim filenames As String
Dim i As Integer
738
Dim shellinfo As SHFILEOPSTRUCT
Die Funktion
SHFileOperation
kann mit einem Stringarray nichts anfangen, wir müssen einen String er-
zeugen, in dem die einzelnen Einträge mit einem Null-Zeichen voneinander getrennt sind:
For i = 0 To UBound(dateinamen)
filenames = filenames & dateinamen(i) & Chr(0)
Next i
filenames = filenames & Chr(0)
With shellinfo
.hwnd = Screen.ActiveForm.hwnd
.wFunc = FO_COPY
.pFrom = filenames
.pTo = zielverzeichnis
If Not IsMissing(inklUnterverzeichnisse) Then
If Not inklUnterverzeichnisse Then .fFlags = FOF_FILESONLY
End If
End With
SHFileOperation shellinfo
End Sub
Das Verschieben von Dateien funktioniert analog:
Public Function Move(dateinamen() As String, zielverzeichnis As String, _
Optional inklUnterverzeichnisse)
Dim filenames As String
Dim i As Integer
Dim shellinfo As SHFILEOPSTRUCT
For i = 0 To UBound(dateinamen)
filenames = filenames & dateinamen(i) & Chr(0)
Next i
filenames = filenames & Chr(0)
With shellinfo
.hwnd = Screen.ActiveForm.hwnd
.wFunc = FO_MOVE
.pFrom = filenames
.pTo = zielverzeichnis
If Not IsMissing(inklUnterverzeichnisse) Then
If Not inklUnterverzeichnisse Then .fFlags = FOF_FILESONLY
End If
End With
SHFileOperation shellinfo
End Function
Beim Löschen von Dateien brauchen wir ein Zielverzeichnis natürlich nicht anzugeben:
Public Function Delete(dateinamen() As String, Optional inklUnterverzeichnisse)
Dim filenames As String
Dim i As Integer
Dim shellinfo As SHFILEOPSTRUCT
For i = 0 To UBound(dateinamen)
filenames = filenames & dateinamen(i) & Chr(0)
Next i
739
Praxisbeispiele
Kapitel 11: Dateien und Verzeichnisse
filenames = filenames & Chr(0)
With shellinfo
.hwnd = Screen.ActiveForm.hwnd
.wFunc = FO_DELETE
.pFrom = filenames
.pTo = "" & Chr(0)
If Not IsMissing(inklUnterverzeichnisse) Then
If Not inklUnterverzeichnisse Then .fFlags = FOF_FILESONLY
End If
End With
SHFileOperation shellinfo
End Function
Test
Vergewissern Sie sich, ob die Datei sowie Quell- und Zielverzeichnis tatsächlich vorhanden sind, ansonsten
erhalten Sie eine entsprechende Fehlermeldung:
Abbildung 11.21 Fehlermeldung bei
nicht vorhandener Datei
Die folgende Abbildung zeigt als Beispiel die bekannte Sicherheitsabfrage vor dem Löschen einer Datei:
Abbildung 11.22 Dialogfeld der Funktion
SHFileOperation
Bemerkungen
Einer der wesentlichsten Vorteile der Funktion SHFileOperation ist die automatische Anzeige von Zu-
satzdialogfeldern (z.B. Warnung beim Überschreiben von Dateien, siehe Abbildung).
Eine alternative Realisierung mittels FileSystemObject (FSO) wird im Abschnitt »Verzeichnisse/Dateien
kopieren/löschen« (Seite 695) beschrieben.
740

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.