Home > Artikel > Ausgabe 2/2019 > Das FileSystemObject: Verzeichnisse

Das FileSystemObject: Verzeichnisse

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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).

Verweis auf die Bibliothek Microsoft Scripting Runtime

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).

FileSystemObject mit IntelliSense nutzen

Bild 2: FileSystemObject mit IntelliSense nutzen

Per Objektkatalog in den Methoden einer Klasse stöbern

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:

Ausgabe einiger Laufwerk-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

Damit wir nicht in jeder Beispielprozedur erneut das FileSystemObject deklarieren und erzeugen müssen, legen wir in einem Standardmodul die folgende private Variable an:

Private m_FSO As FileSystemObject

Zusätzlich fügen wir dem Modul die folgende Property Get-Prozedur hinzu, die prüft, ob m_FSO bereits mit dem FileSystemObject-Objekt gefüllt ist. Falls nicht, wird es nun erstellt und in m_FSO geschrieben. Danach gibt die Property-Prozedur den Verweis zurück:

Public Property Get FSO() As FileSystemObject

If m_FSO Is Nothing Then

Set m_FSO = New FileSystemObject

End If

Set FSO = m_FSO

End Property

Sie können nun in den folgenden Prozeduren einfach mit FSO auf das FileSystemObject zugreifen.

Prüfen, ob ein Laufwerk vorhanden ist

Wenn Sie prüfen möchten, ob ein Laufwerk mit einem bestimmten Laufwerksbuchstaben vorhanden ist, können Sie dazu die DriveExists-Funktion verwenden und entweder nur den Laufwerksbuchstaben übergeben oder zusätzlich weitere Zeichen:

Debug.Print FSO.DriveExists("C")

Debug.Print FSO.DriveExists("C:")

Debug.Print FSO.DriveExists("C:\")

Laufwerk zu bestimmtem Verzeichnis

Wenn Sie etwa das Laufwerk ermitteln wollen, auf dem sich der aktuelle Datenbankordner befindet, können Sie GetDriveName wie in folgender Anweisung verwenden:

FSO.GetDriveName(CurrentProject.Path)

C:

Damit erhalten Sie allerdings nur den Buchstaben des Laufwerks mit dem abschließenden Doppelpunkt. Mit diesem können Sie jedoch über die folgende Funktion einen Verweis auf ein Verzeichnis erhalten:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!