Dateisystem

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.

Drives

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.

Folders

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.

Files

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.