VBA enthält bekanntlich einige Funktionen für
den Zugriff auf Dateien und Verzeichnisse. Obwohl diese Funktionen streng genommen
veraltet sind, werden sie bis heute gern genutzt, weil sie bequem zu handhaben sind.
Falls allerdings einmal ein umfangreicherer Zugriff auf Laufwerke, Verzeichnisse
und Dateien notwendig ist, empfiehlt sich das modernere, objektbasierte
FileSystemObject
. Da dessen Objekthierarchie sehr einfach aufgebaut
ist, wird es in der Praxis meistens per Late Binding
genutzt. Zum besseren Verständnis wird in den folgenden Beispielen dennoch
vorausgesetzt, dass die Microsoft Scripting Runtime
-Objektbibliothek
eingebunden ist.
Im Wesentlichen stellt das FileSystemObject
drei
Objekte zur Verfügung: Drive, Folder und File.
Sie alle haben ähnliche Eigenschaften und Methoden. Dazu korrespondierend gibt es
noch drei Auflistungen: Drives, Folders
und Files. Da sowohl die Objekte als auch deren Eigenschaften und Methoden soweit
selbsterklärend sind, werden hier nicht alle davon aufgeführt.
Das folgende Beispiel gibt Informationen zu allen vorhandenen Laufwerken zurück.
Public Sub ZeigeDrives() Dim fso As New FileSystemObject, d As drive, ds As Drives Set ds = fso.Drives For Each d In ds Debug.Print d.DriveLetter, 'Laufwerksbuchstabe If d.IsReady Then If d.DriveType = Remote Then 'Laufwerkstyp Debug.Print d.ShareName, Else Debug.Print d.VolumeName, End If Debug.Print d.FreeSpace & " von " & d.TotalSize & " frei" 'Speicherplatz Else Debug.Print "Keine CD eingelegt" End If Next End Sub
Die Prozedur durchläuft alle vorhandenen Laufwerke. Erst wird der
Laufwerksbuchstabe ausgegeben und dann mit isReady
geprüft, ob das
Laufwerk bereit ist. CD−Laufwerke geben an dieser Stelle False
zurück, wenn keine CD eingelegt ist. Anschließend wird der Laufwerksname ausgegeben,
wobei zuerst mit DriveType
und der Auflistung
DriveTypeConst
der Laufwerkstyp geprüft wird. Für Netzwerke muss der Name nämlich mit
ShareName
, ansonsten mit VolumeName
abgefragt werden.
Zu guter Letzt folgen noch zwei Angaben zum Speicherplatz.
Eine weitere interessante Eigenschaft von Drives
ist SerialNumber
,
mit der ein eindeutiger Bezeichner eines Datenträgers abgerufen werden kann. Das
ist z. B. hilfreich, um verschiedene Wechseldatenträger
zu unterscheiden, die ja, wenn man sie nacheinander nutzt, den gleichen
Laufwerksbuchstaben haben können.
Analog zu den Laufwerken, zeigt die folgende Prozedur Informationen zu den Verzeichnissen eines bestimmten Laufwerks oder übergeordneten Verzeichnisses an.
Public Sub zeigeFolders(Verzeichnis As String) Dim fso As New FileSystemObject, fs As Folders, f As Folder If fso.FolderExists(Verzeichnis) Then 'Prüfen, ob Verzeichnis existiert Set f = fso.GetFolder(Verzeichnis) Set fs = f.SubFolders For Each f In fs Debug.Print f.DateCreated; f.Attributes; f.Name, f.Path Next End If End Sub
Zunächst wird mit FolderExists
geprüft, ob das angegebene Verzeichnis
überhaupt existiert. Anschließend werden Angaben seiner Unterverzeichnisse ausgegeben.
Neben DateCreated
stehen auch noch DateLastAccessed
und
DateModified
zur Verfügung. Anschließend werden verschiedene Attribute
ausgegeben, die in der Auflistung
FileAttribute
stecken. Dabei können verschiedene Eigenschaften zusammen bitweise ausgelesen werden.
Diese Eigenschaftenliste gilt nicht nur für Verzeichnisse, sondern auch für Dateien.
Abschließend noch ein Beispiel für den Zugriff auf Dateien.
Public Sub zeigeFiles(Start As String) Dim fso As New FileSystemObject, fld As Folder, fs As Files, f As File If fso.FolderExists(Start) Then Set fld = fso.GetFolder(Start) 'Vom Verzeichnis ... Set fs = fld.Files '... zu den Dateien For Each f In fs Debug.Print f.DateCreated; f.Attributes, f.Size, f.Name, f.Type Next End If End Sub
Auch hier wird erst mit FolderExists
geprüft. Es gibt zwar auch
die Methode FileExists
, die aber in diesem Beispiel nicht so sinnvoll
wäre.
Für Dateien gibt es die gleichen Datumseigenschaften und die gleiche FileAttribute-Liste wie für Verzeichnisse.