Die VBA-eigenen Befehle wie Dir, MkDir, Kill, Copy und so weiter erlauben grundlegende Dateioperationen. Wenn es etwas komfortabler sein darf, gibt es jedoch noch andere Möglichkeiten. Eine davon ist die Klasse FileSystemObject, die Sie in der Bibliothek Microsoft Scripting Runtime finden. Dieser Artikel zeigt, welche Möglichkeiten diese Bibliothek bietet.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1902_FileSystemObject.accdb.
Late Binding und Early Binding
Wie bei vielen anderen Bibliotheken können Sie auch die Elemente der Bibliothek Microsoft Scripting Runtime per Late Binding oder per Early Binding nutzen. Die Version mit Late Binding verwendet keinen Verweis und bindet die Bibliothek erst beim Aufruf ein. Das könnte etwa wie folgt aussehen:
Public Sub FSOLateBinding() Dim objFSO As Object Set objFSO = _ CreateObject("Scripting.FileSystemObject") With objFSO Debug.Print .FolderExists("c:") End With End Sub
Hier deklarieren wir die Objektvariable mit dem Datentyp Object. Das hat den Nachteil, dass wir nicht per IntelliSense auf die Elemente dieser Klasse zugreifen können. In diesem Beispiel nutzen wir die FolderExists-Funktion, um zu prüfen, ob das Verzeichnis c: vorhanden ist.
Wenn Sie lieber mit IntelliSense arbeiten, was beim Programmieren wesentlich komfortabler ist, fügen Sie einen Verweis auf die Bibliothek Microsoft Scripting Runtime hinzu. Dazu öffnen Sie den VBA-Editor, etwa mit der Tastenkombination Alt + F11, und aktivieren dann mit dem Menübefehl Extras|Verweise die Anzeige des Verweise-Dialogs für das aktuelle VBA-Projekt. Hier wählen Sie den Eintrag Microsoft Scripting Runtime aus und aktivieren diesen (siehe Bild 1).
Bild 1: Verweis auf die Bibliothek Microsoft Scripting Runtime
Danach können Sie die Objektvariable für die Klasse FileSystemObject auch mit diesem Datentyp deklarieren:
Public Sub FSOEarlyBinding() Dim objFSO As FileSystemObject Set objFSO = New FileSystemObject With objFSO Debug.Print .FolderExists("c:") End With End Sub
Ein weiterer Unterschied ist, dass Sie nun die Methoden der Klasse per IntelliSense anzeigen können (siehe Bild 2). Alternativ können Sie sich natürlich auch über den Objektkatalog einen überblick über die Methoden und Eigenschaften des Objekts einer Bibliothek verschaffen. Den Objektkatalog blenden Sie mit der Tastenkombination F2 ein. Um die Elemente der gewünschten Bibliothek zu betrachten, wählen Sie diese oben im Kombinationsfeld aus. Dann können Sie unten die entsprechende Klasse anklicken und finden alle Element im rechten Listenfeld vor (siehe Bild 3).
Bild 2: FileSystemObject mit IntelliSense nutzen
Bild 3: Per Objektkatalog in den Methoden einer Klasse stöbern
Elemente der FileSystemObject-Klasse
Die Klasse, die wir uns in diesem Artikel ansehen, hat die folgenden Elemente:
- BuildPath: Stellt Verzeichnisnamen zusammen auf Basis eines Verzeichnisnamens und des Namens für das Unterverzeichnis. Das Backslash-Zeichen (\) wird dabei automatisch eingefügt.
- CopyFile: siehe Das FileSystemObject: Dateien
- CopyFolder: Kopiert das im ersten Parameter per Pfad angegebene Verzeichnis in das im zweiten Parameter angegebene Verzeichnis.
- CreateFolder: Erstellt das als Parameter angegebene Verzeichnis.
- CreateTextFile: siehe Das FileSystemObject: TextStream
- DeleteFile: siehe Das FileSystemObject: Dateien
- DeleteFolder: Löscht den Ordner mit dem angegebenen Pfad.
- DriveExists: Prüft, ob ein Laufwerk vorhanden ist.
- Drives: Liefert eine Auflistung aller Laufwerke.
- FileExists: siehe Das FileSystemObject: Dateien
- FolderExists: Prüft, ob das Verzeichnis mit dem als Parameter angegebenen Namen existiert.
- GetAbsolutePathName: Ermittelt den Pfad ohne abschließenden Backslash.
- GetBasePathName: siehe Das FileSystemObject: Dateien
- GetDrive: Ermittelt das Drive-Objekt zu einem Laufwerksbuchstaben.
- GetDriveName: Ermittelt den Laufwerksbuchstaben eines Pfades.
- GetExtensionName: siehe Das FileSystemObject: Dateien
- GetFile: siehe Das FileSystemObject: Dateien
- GetFileName: siehe Das FileSystemObject: Dateien
- GetFileVersion: siehe Das FileSystemObject: Dateien
- GetFolder: Referenziert das als Parameter angegebene Verzeichnis.
- GetParentFolderName:
- GetSpecialFolder: Ermittelt spezielle Verzeichnisse wie etwa das Windows-Verzeichnis.
- GetStandardStream: siehe Das FileSystemObject: TextStream
- GetTempName: siehe Das FileSystemObject: Dateien
- MoveFile: siehe Das FileSystemObject: Dateien
- MoveFolder: Verschiebt das als ersten Parameter angegebene Verzeichnis und fügt es als das mit dem zweiten Parameter angegebene Verzeichnis wieder ein.
- OpenTextFile: siehe Das FileSystemObject: TextStream
Mit Laufwerken arbeiten
Wir beginnen mit der obersten Ebene im Dateisystem – den Laufwerken. Dazu nutzen wir gleich das einzige Element der Klasse FileSystemObject, das keine Funktion oder Methode ist, nämlich die Auflistung Drives. Die folgende Prozedur ermittelt die Anzahl der Laufwerke und gibt diese im Direktbereich aus. Danach durchlaufen wir die Laufwerke in einer For Each-Schleife, wobei wir das aktuelle Laufwerk jeweils der Variablen objDrive mit dem Datentyp Drive zuweisen. Dieses liefert einige Eigenschaften zum jeweiligen Laufwerk, von denen wir hier beispielhaft den Laufwerkbuchstaben, den Typ, die Bezeichnung des Filesystems und den verfügbaren Speicherplatz im Direktbereich ausgeben:
Public Sub Laufwerke() Dim objFSO As FileSystemObject Dim objDrive As Scripting.Drive Set objFSO = New FileSystemObject Debug.Print objFSO.Drives.Count For Each objDrive In objFSO.Drives With objDrive On Error Resume Next Debug.Print .DriveLetter, Debug.Print .DriveType, Debug.Print .FileSystem, If Err.Number = 71 Then Debug.Print "Nicht bereit.", End If Err.Clear Debug.Print .FreeSpace If Err.Number = 71 Then Debug.Print "Nicht bereit." End If End With Next objDrive End Sub
Im Falle der beiden Eigenschaften FileSystem und FreeSpace tritt ein Fehler auf, wenn das jeweilige Laufwerk nicht bereit ist. Das ist etwa der Fall, wenn wir ein DVD-Laufwerk untersuchen, das aktuell keine DVD enthält. Diesen Fehler fangen wir ab und geben stattdessen den Text Nicht bereit. aus. Wir könnten auch in einer If…Then-Bedingung prüfen, ob die Eigenschaft IsReady den Wert True zurückgibt. Dann würden wir uns die Fehlerbehandlung sparen:
With objDrive Debug.Print .DriveLetter, Debug.Print .DriveType, If .IsReady Then Debug.Print .FileSystem, Debug.Print .FreeSpace, Debug.Print .VolumeName, Else Debug.Print "Nicht bereit.", Debug.Print "Nicht bereit.", Debug.Print "Nicht bereit.", End If Debug.Print .ShareName End With
Das Ergebnis sieht etwa wie in Bild 4 aus. Die ersten beiden Laufwerke sind Festplatten mit dem Format NTSF, das dritte ein DVD-Laufwerk und das vierte ein USB-Stick, der im Format exFAT formatiert ist. Die Zahlenwerte für die Eigenschaft DriveType bedeuten CDRom (4), Fixed (2), RamDisk (5), Remove (3), Removable (1) und UnknownType (0). Die Drive-Klasse bietet die folgenden Eigenschaften:
Bild 4: Ausgabe einiger Laufwerk-Eigenschaften
- AvailableSpace: Verfügbarer Speicherplatz
- DriveLetter: Großbuchstabe für das Laufwerk (zum Beispiel C oder D)
- DriveType: Typ des Laufwerks
- FileSystem: Bezeichnung des Dateisystems
- FreeSpace: Verfügbarer Speicherplatz
- IsReady: Gibt an, ob das Laufwerk bereit ist
- Path: Großbuchstabe für das Laufwerk plus Doppelpunkt, also etwa C: oder D:
- RootFolder: Liefert ein Folder-Objekt, welches das Basisverzeichnis repräsentiert, also etwa C:\. Damit können Sie weitere Optionen ausführen wie etwa die Unterverzeichnisse ermitteln.
- SerialNumber: Serielle Nummer des Laufwerks.
- ShareName: Netzwerkfreigabename des Laufwerks
- TotalSize: Gesamter Speicherplatz
- VolumeName: Benutzerdefinierter Name des Laufwerks
Zur Vereinfachung: FileSystemObject als Property
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: