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

Das FileSystemObject: Dateien

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. Im Artikel Das FileSystemObject: Verzeichnisse haben wir die Grundlagen zu dieser Bibliothek und zum Umgang mit Laufwerken und Verzeichnissen erläutert. Dieser Artikel zeigt, welche Möglichkeiten diese Bibliothek im Hinblick auf den Umgang mit Dateien bietet.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1902_FileSystemObject_Files.accdb.

Der oben genannte Artikel hat die Grundlagen zum FileSystemObject und zu den Auflistungen Drives und Folders sowie den Klassen Drive und Folder erläutert. Nun gehen wir einen Schritt weiter und schauen uns an, wie wir mit den in den Verzeichnissen enthaltenen Dateien arbeiten können. Diese referenzieren wir über die Files-Auflistung beziehungsweise im Falle einer einzelnen Datei über die File-Klasse.

Schneller Zugriff auf ein FileSystemObject-Objekt

Wie schon im Artikel Das FileSystemObject: Verzeichnisse beschrieben, verwenden wir die folgende private Variable und die öffentliche Property Get-Prozedur, um schnell Zugriff auf eine Instanz der FileSystemObject-Klasse zu erhalten:

Private m_FSO As FileSystemObject

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 dann einfach über den Ausdruck FSO auf das FileSystemObject zugreifen – also etwa so:

Debug.Print FSO.Drives.Count

Dateien auflisten

Wenn wir Dateien auflisten wollen, benötigen wir zunächst ein Folder-Objekte, also ein Verzeichnis, in dem die zu untersuchenden Dateien enthalten sind. Wir beschäftigen uns mit dem Verzeichnis der aktuellen Datenbank, das wir mit dem VBA-Befehl CurrentProject.Path auslesen. Das dazugehörige Folder-Objekte erhalten wir mit der GetFolder-Methode:

Public Sub DateienAuflisten()

Dim objFile As File

Dim objFolder As Folder

Set objFolder = FSO.GetFolder(CurrentProject.Path)

For Each objFile In objFolder.Files

Debug.Print objFile.Name

Next objFile

End Sub

In der Prozedur ermitteln wir das Folder-Objekt und durchlaufen alle in der Files-Auflistung dieses Verzeichnisses enthaltenen File-Objekte. Wir geben zu jedem File-Objekt den Namen aus der Eigenschaft Name im Direktbereich aus. Auf die gleiche Weise können wir die folgenden Informationen des File-Objekts ausgeben lassen:

  • Attributes: Gibt einen Zahlenwert für verschiedene Attributwerte zurück.
  • DateCreated: Gibt das Erstellungsdatum zurück.
  • DateLastAccessed: Gibt das Datum des letzten Zugriffs zurück.
  • DateLastModified: Gibt das Datum der letzten Änderung zurück.
  • Name: Gibt den Namen der Datei aus.
  • Path: Gibt den Pfad der Datei zurück.
  • ShortName: Gibt den Dateinamen im 8.3-Format zurück.
  • ShortPath: Gibt den Pfad zur Datei im 8.3-Format zurück.
  • Size: Gibt die Größe der Datei zurück.
  • Type: Gibt den Dateityp zurück.

Wenn Sie all diese Informationen für die Dateien aus der obigen Prozedur ausgeben wollen, erweitern Sie den Inhalt der For Each-Schleife wie folgt:

With objFile

Debug.Print .Name, .Attributes, .DateCreated, .DateLastAccessed, .DateLastModified, .Path, .ShortName, .ShortPath, .Type

End With

Für die Eigenschaft Type erhalten wir Texte wie etwa Microsoft Access Database, LACCDB-Datei oder Snagit Editor Image. Teilweise werden hier Typen ausgeben, die mit der standardmäßig zu öffnenden Anwendung zusammenhängen, teilweise nur die Dateiendung.

Eigenschaften mit Objekten

Es gibt zwei Eigenschaften, die Verweise auf Objekte zurückliefern:

  • Drive: Gibt das Drive-Objekt zu der Datei zurück.
  • ParentFolder: Gibt das Folder-Objekt zurück, in dem sich die Datei befindet.

Methoden und Funktionen des File-Objekts

Das File-Objekt enthält neben den bereits erwähnten Eigenschften noch die folgenden Methoden und Funktionen:

  • Copy: Kopiert die Datei an den angegebenen Zielpfad.
  • Delete: Löscht die referenzierte Datei.
  • Move: Verschiebt die Datei an den angegebenen Zielpfad.
  • OpenAsTextStream: Öffnet die Datei als Text-Stream.

Elemente der FileSystemObject-Klasse für den Umgang mit File-Objekten

Und auch die FileSystemObject-Klasse stellt noch Eigenschaften, Methoden und Funktionen bereit, die Sie in Zusammenhang mit File-Objekten verwenden können:

  • CopyFile: Kopiert eine Datei. Erwartet Quell- und Zielpfad als Parameter.
  • CreateTextFile: Erstellt ein TextStream-Objekt, das als Textdatei gespeichert wird.
  • DeleteFile: Löscht die als Pfad angegebene Datei.
  • FileExists: Untersucht, ob eine Datei existiert.
  • GetBaseName: Liefert den Dateinamen ohne Dateiendung.
  • GetExtensionName: Liefert die Dateiendung.
  • GetFile: Liefert das File-Objekt zur Datei mit dem als Parameter angegebenen Pfad.
  • GetFileName: Liefert den kompletten Dateinamen.
  • GetFileVersion: Liefert die Dateiversion von .exe- und .dll-Dateien.
  • GetStandardStream: siehe Das FileSystemObject: Textdateien
  • GetTempName: Ermittelt einen temporären Dateinamen.
  • MoveFile: Verschiebt die Datei an den als Parameter angegebenen Pfad.
  • OpenTextFile: siehe Das FileSystemObject: Textdateien

Elemente der Folder-Klasse für den Umgang mit File-Objekten

Und schließlich finden wir auch in der Folder-Klasse noch Methoden und Auflistungen für den Umgang mit File-Objekten. Die Files-Auflistung haben wir ja bereits weiter oben beschrieben:

  • CreateTextFile: Erstellt ein TextStream-Objekt, das als Textdatei gespeichert wird.
  • Files: Enthält eine Auflistung aller File-Objekte des Folder-Objekts.

Dateien als File-Objekte referenzieren

Eine erste Möglichkeit, wie Sie Dateien als File-Objekte referenzieren können, haben Sie ja bereits weiter oben kennengelernt – nämlich über die Auflistung Files eines Folder-Objekts.

Sie können aber auch auf ein File-Objekt zugreifen, wenn Sie nur seinen Pfad kennen. Dazu verwenden Sie die GetFile-Methode der FileSystemObjekt-Klasse:

Public Sub DateiReferenzieren()

Dim objFile As File

Dim strPfad As String

strPfad = FSO.BuildPath(CurrentProject.Path, "pic001.png")

Set objFile = FSO.GetFile(strPfad)

Debug.Print objFile.Path

End Sub

Damit können Sie dann etwa alle Eigenschaften der mit objFile referenzieren Datei ermitteln oder auch die Methoden und Funktionen der File-Klasse nutzen. Diese lernen Sie in den folgenden Abschnitten kennen. Hier haben wir die BuildPath-Methode genutzt, um einen Pfad aus dem Verzeichnis der aktuellen Datenbank und der darin enthaltenen Datei pic001.png zu erstellen. Damit brauchen Sie sich zum Beispiel nicht mehr darum zu kümmern, ob CurrentProject.Path nun mit oder ohne abschließendes Backslash-Zeichen kommt. Danach ermitteln wir mit GetFile das File-Objekt zu der in strPfad angegebenen Datei und geben ihren Pfad im Direktbereich des VBA-Editors aus.

Prüfen, ob eine Datei existiert

Unter VBA verwenden Sie die Dir-Funktion, um zu prüfen, ob eine Datei oder ein Verzeichnis existiert. Die FileSystemObject-Klasse bietet dazu spezifischere Methoden wie die im oben genannten Artikel beschriebene Funktion FolderExists und die nun vorgestellte Funktion FileExists. Diese erwartet die Angabe des Pfades zu der zu untersuchenden Datei als Parameter:

Dim strPfad As String

strPfad = FSO.BuildPath(CurrentProject.Path, "pic001.png")

Debug.Print FSO.FileExists(strPfad)

Informationen zur Datei

Über das FileSystemObject-Objekt lassen sich noch weitere Informationen zu einer Datei ermitteln, wenn Sie den Pfad zu dieser Datei kennen. Die folgenden Anweisungen liefern einige Informationen:

Dim strPfad As String

strPfad = FSO.BuildPath(CurrentProject.Path, "pic001.png")

Debug.Print "BaseName: " & FSO.GetBaseName(strPfad)

Debug.Print "ExtensionName: " & FSO.GetExtensionName(strPfad)

Debug.Print "FileName: " & FSO.GetFileName(strPfad)

Debug.Print "FileVersion: " & FSO.GetFileVersion(strPfad)

Wenn Sie diese Anweisungen ausführen, werden Sie feststellen, dass GetFileVersion eine leere Zeichenkette zurückliefert. Der Grund ist, dass diese Funktion nur für .exe- und .dll-Dateien eine Rückgabe liefert. Das können wir leicht anhand der Datei MSAccess.exe ausprobieren. Dazu ermitteln wir mit SysCmd(acSysCmdAccessDir) das Verzeichnis, in dem sich die MSAccess.exe befindet, und fügen diese mit der BuildPath-Funktion mit der Datei MSAccess.exe zusammen. Dann ermitteln wir die Dateiversion für diese Datei:

strPfad = FSO.BuildPath(SysCmd(acSysCmdAccessDir), "MSAccess.exe")

Debug.Print "FileVersion MSAccess.exe: " & FSO.GetFileVersion(strPfad)

Das Ergebnis sieht etwa wie folgt aus:

FileVersion MSAccess.exe: 16.0.11425.20204

Einen temporären Dateinamen ermitteln

Wenn Sie etwa eine Textdatei nur temporär speichern wollen und dazu auf die schnelle einen Dateinamen generieren wollen, können Sie die Funktion GetTempName verwenden:

Public Sub TemporaererDateiname()

Debug.Print FSO.GetTempName

End Sub

Dies liefert beispielsweise folgende Dateinamen:

rad3D177.tmp

radAFF3D.tmp

radE6DC2.tmp

rad163EE.tmp

Dateien löschen

Wenn Sie eine Datei löschen wollen, haben Sie zwei Möglichkeiten. Welche Sie nutzen, hängt davon ab, ob der Pfad der zu löschenden Datei vorliegt oder ob bereits ein Verweis auf die zu löschende Datei vorliegt.

Wenn Sie den Pfad der zu löschenden Datei kennen, können Sie die DeleteFile-Methode der FileSystemObject-Klasse verwenden:

Dim strPfad As String

strPfad = FSO.BuildPath(CurrentProject.Path, "pic001.png")

FSO.DeleteFile strPfad

Der DeleteFile-Methode können Sie noch den Wert True für den Parameter Force übergeben. Dieser legt fest, dass auch etwa als schreibgeschützt markierte Dateien gelöscht werden sollen.

Datei per File-Objekt löschen

Sie können die Datei auch löschen, wenn Sie bereits ein File-Objekt mit einem Verweis auf diese Datei versehen haben – etwa über die GetFile-Methode. Dann nutzen Sie einfach die Delete-Methode des File-Objekts zum Löschen der Datei:

Dim objFile As File

Dim strPfad As String

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!