Dateisystem im Griff mit dem FileSystemObject

Für viele Fälle reichen die in VBA integrierten Befehle wie Dir, MkDir, Kill oder Copy aus. Manchmal stoßen Sie damit aber an die Grenzen der VBA-Bibliothek. In diesem Fall hilft möglicherweise das FileSystemObject weiter. Es bietet umfangreiche Möglichkeiten, auf Laufwerke, Verzeichnisse und Dateien zuzugreifen. Dieser Beitrag zeigt, wie Sie das FileSystemObject verfügbar machen und welche interessanten Aktionen Sie damit durchführen können.

Das FileSystemObject ist Bestandteil der Bibliothek Microsoft Scripting Runtime, die Sie zur einfacheren Programmierung per IntelliSense per Verweis einbinden (s. Abb. 1). Den Verweise-Dialog öffnen Sie über den Menübefehl Extras|Verweise des VBA-Editors.

pic001.png

Abb. 1: Verweis auf die Microsoft Scripting Runtime

Objekte

Das Objekt FileSystemObject ist das Hauptobjekt für den Zugriff auf Laufwerke, Verzeichnisse und Dateien. Wenn Sie auf eines dieser Objekte zugreifen möchten, benötigen Sie meist eine der Methoden des FileSystemObjects. Um das FileSystemObject zu nutzen, deklarieren und instanzieren Sie es zuvor:

Dim objFSO As Scripting.FileSystemObject
Set objFSO = New Scripting.FileSystemObject

Danach greifen Sie per IntelliSense bequem auf seine Eigenschaften und Methoden zu.

Existenz von Laufwerken, Verzeichnissen und Dateien prüfen

In vielen Fällen werden Sie vor einer Aktion mit dem jeweiligen Objekt prüfen, ob dieses überhaupt existiert.

Beim Laufwerk liefert die Funktion DriveExists die notwendige Information. Das folgende Beispiel zeigt für einen modernen Rechner, dass es zwar ein Laufwerk mit dem Buchstaben c gibt, aber keines mit dem Buchstaben a:

Dim objFSO As Scripting.FileSystemObject
Set objFSO = New Scripting.FileSystemObject
Debug.Print objFSO.DriveExists("a")
Debug.Print objFSO.DriveExists("c")

Bei Verzeichnissen ist die Funktion FolderExists für die Prüfung der Existenz verantwortlich. Die folgenden Zeilen belegen, dass das Verzeichnis, in dem sich die aktuelle Datenbank befindet, tatsächlich vorhanden ist:

Debug.Print objFSO.FolderExists(CurrentProject.Path)

ähnlich sieht es bei den Dateien aus – hier muss die Funktion FileExists Ihren Dienst verrichten. Die folgende Zeile liefert hoffentlich den Wert True zurück:

Debug.Print objFSO.FileExists(CurrentDb.Name)

Laufwerke

Auf die Laufwerke können Sie direkt mithilfe der Auflistung Drives des FileSystemObject-Objekts zugreifen. Die Anzahl der Laufwerke ermitteln Sie mit der Eigenschaft Drives.Count.

Den Zugriff auf die einzelnen Laufwerk-Objekte über die Item-Eigenschaft erhalten Sie nur durch Angabe des Laufwerkbuchstabens:

With objFSO
    Debug.Print "Laufwerke: ", .Drives.Count
    Debug.Print .Drives.Item("c").VolumeName
End With

Wenn Sie alle Laufwerke samt Laufwerksbuchstabe und weiteren Informationen ermitteln möchten, greifen Sie per For Each-Schleife darauf zu.

Beispiele für den Zugriff auf die Elemente der Drives-Auflistung haben wir im Formular frmLaufwerke und dessen Klassenmodul untergebracht.

Als erstes soll das Kombinationsfeld mit dem Laufwerksbuchstaben in der gebundenen, unsichtbaren Spalte und dem Pfad als sichtbarem Eintrag gefüllt werden.

Dies erledigt die folgende Prozedur, die zunächst in einer For Each-Schleife alle Laufwerke des aktuellen Systems durchläuft. Dabei trägt Sie die für die Anzeige im Kombinationsfeld nötigen Daten zusammen. Das Ergebnis sieht etwa so aus:

C;C:;D;D:;E;E:;F;F:;G;G:;

Es wird also für jedes Laufwerk zunächst der einzelne Buchstabe und dann der Pfad ausgegeben. Da das Kombinationsfeld den Wert Wertliste für die Eigenschaft Herkunftsart sowie die Werte 2 und 0cm für die Eigenschaften Spaltenanzahl und Spaltenbreiten enthält, zeigt es genau die Pfade an (s. Abb. 2).

pic002.png

Abb. 2: Formular zur Anzeige von Laufwerksdaten

Der erste Eintrag wird gleich beim Laden des Formulars ausgewählt und die Prozedur DatenLesen ausgeführt, die das Formular mit weiteren Laufwerkseigenschaften füllt (s. Listing 1).

Listing 1: Einlesen von Informationen über das aktuell ausgewählte Laufwerk

Private Sub Form_Load()
    Dim objDrive As Scripting.Drive
    Dim strDrives As String
    Set objFSO = New Scripting.FileSystemObject
    For Each objDrive In objFSO.Drives
        With objDrive
            strDrives = strDrives & objDrive.DriveLetter & ";" & objDrive.Path & ";"
        End With
    Next objDrive
    Me!cboLaufwerke.RowSource = strDrives
    Me!cboLaufwerke = Me!cboLaufwerke.ItemData(0)
    DatenLesen
End Sub

Die Prozedur DatenLesen wird nicht nur beim Laden, sondern auch nach dem Auswählen eines anderen Eintrags im Kombinationsfeld cboLaufwerke aufgerufen. Sie füllt die Textfelder des Formulars mit weiteren Informationen, die allesamt das jeweilige Drive-Objekt bereitstellt (s. Listing 2).

Listing 2: Einlesen von Informationen über das aktuell ausgewählte Laufwerk

Private Sub DatenLesen()
    Dim objDrive As Scripting.Drive
    Set objDrive = objFSO.Drives(Me!cboLaufwerke)
    With objDrive
        Me!txtDriveletter = .DriveLetter
        Me!txtDriveType = .DriveType
        Me!txtPath = .Path
        Me!txtShareName = .ShareName
        If .IsReady Then
            Me!txtFileSystem = .FileSystem
            Me!txtFreeSpace = .FreeSpace
            Me!txtRootFolder = .RootFolder
            Me!txtSerialNumber = .SerialNumber
            Me!txtTotalSize = .TotalSize
            Me!txtVolumename = .VolumeName
        Else
            MsgBox "Laufwerk ''" & Me!cboLaufwerke.Column(1) & "'' nicht bereit."
            Me!txtFileSystem = Null
            Me!txtFreeSpace = Null
            Me!txtRootFolder = Null
            Me!txtSerialNumber = Null
            Me!txtTotalSize = Null
            Me!txtVolumename = Null
        End If
    End With
End Sub

Sollte das jeweilige Laufwerk nicht bereit sein, was beispielsweise bei CD- oder DVD-Laufwerken geschieht, die gerade keinen Datenträger enthalten, erscheint eine Meldung und es werden entsprechend weniger Informationen im Formular angezeigt. Diesen Zustand fragen Sie übrigens mit der Eigenschaft IsReady ab.

Verzeichnisse lesen

Prinzipiell ist c:\\ auch ein Verzeichnis, zumindest wenn man der Nomenklatur des Objektmodells unterhalt des FileSystemObject-Objekts glaubt. Die Eigenschaft RootFolder liefert nämlich genau diese Information. Allerdings tut sie das nur, weil RootFolder ein eigenes Objekt mit der Eigenschaft Name als Standardeigenschaft ist. Mit der Eigenschaft RootFolder können Sie also auch ein Objekt des Typs Folder referenzieren – und zwar zum Beispiel c:\\.

Unterhalb eines Laufwerks gibt es in der Regel einen oder mehrere Verzeichnisse. Auf diese greifen Sie über die Folders-Auflistung des Drive-Objekts zu.

Wenn Sie zuvor das RootFolder-Objekt eines Verzeichnisses ermitteln, in diesem Fall c:, greifen Sie wie folgt auf die unterhalb von c:\\ liegenden Verzeichnisse zu und geben diese im Direktfenster aus (s. Listing 3).

Listing 3: Verzeichnisse eines Laufwerks ausgeben

Public Sub Verzeichnisse()
    Dim objFSO As Scripting.FileSystemObject
    Dim objDrive As Scripting.Drive
    Dim objRootFolder As Scripting.Folder
    Dim objFolder As Scripting.Folder
    Set objFSO = New Scripting.FileSystemObject
    Set objDrive = objFSO.Drives("c")
    Set objRootFolder = objDrive.RootFolder
    For Each objFolder In objRootFolder.SubFolders
         Debug.Print objFolder.path
    Next objFolder
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar