Mit Dateien und Verzeichnissen arbeiten

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wer unter Visual Studio Anwendungen mit Visual Basic programmiert, wird früher oder später an den Punkt kommen, wo er mit Dateien und Verzeichnissen arbeitet. Dabei gibt es Aufgaben wie zu ermitteln, ob eine Datei bereits vorhanden ist, eine Datei von einem Verzeichnis in ein anderes zu kopieren, alle Dateien eines Verzeichnisses zu durchlaufen oder dies gar rekursiv für untergeordnete Verzeichnisse und Dateien zu erledigen. Natürlich bietet Microsoft passende Möglichkeiten an, die kaum noch etwas mit den von VBA gewohnten Befehlen zu tun haben und auch nicht mit den Methoden des FileSystemObjects.

Die Beispiele dieses Artikels haben wir mit dem Tool LINQPad durchgespielt, das die einfache Eingabe von Visual Basic- und C#-Anweisungen und deren Ausführung erlaubt. Sie müssen hier nicht immer erst das Projekt kompilieren, um die enthaltenen Anweisungen zu debuggen, sondern können dies quasi ad hoc erledigen (Download siehe https://www.linqpad.net).

Der Namespace System.IO

Die Objekte, Methoden und Eigenschaften, die wir in diesem Artikel vorstellen, befinden sich im Namespace System.IO. Um diesen für eine Datei in LINQPad verfügbar zu machen, betätigen Sie die Taste F4. Dadurch wird der Dialog Query Properties geöffnet. In diesem wechseln Sie zum zweiten Registerreiter Additional Namespace Imports. Hier tragen Sie einfach wie in Bild 1 den folgenden Namespace ein:

Hinzufügen von Namespaces

Bild 1: Hinzufügen von Namespaces

System.IO

Danach stehen die Elemente dieses Namespaces in dem entsprechenden Fenster von LINQPad zur Verfügung.

Laufwerke

Das oberste Element der Hierarchie der Elemente des Dateisystems sind die Laufwerke. Diese können wir über die Funktion GetDrives auslesen und erhalten damit Objekte des Typs DriveInfo. Diese wiederum liefern einige Eigenschaften, mit denen wir die Informationen zum jeweiligen Laufwerk auslesen können.

Laufwerke ausgeben

Die Anweisungen, die wir ausprobieren wollen, fügen wir jeweils in die Sub Main-Prozedur ein. Wir steigen gleich ein und wollen alle Laufwerke des aktuellen Rechners im Direktfenster ausgeben. Dazu deklarieren wir zunächst ein Array namens objDrives und eine Variable namens objDrive, beide vom Typ DriveInfo. Es gibt kein Auflistungsobjekt, sondern eine Funktion namens GetDrives, die alle Laufwerke zurückliefert. Das Ergebnis, das wir zum Array objDrives hinzufügen, durchlaufen wir in einer For Each-Schleife. Dabei referenzieren wir das aktuelle Element jeweils mit der Variablen objDrive und geben den Wert seiner Eigenschaft Name aus:

Sub Main
     Dim objDrives() As DriveInfo
     Dim objDrive As DriveInfo
     objDrives = DriveInfo.GetDrives()
     For Each objDrive In objDrives
         Debug.print (objDrive.Name)
     Next objDrive    
End Sub 

Das Ergebnis sieht im Fall des hier verwendeten Rechners etwa wie in Bild 2 aus.

Ausgabe der Laufwerksnamen

Bild 2: Ausgabe der Laufwerksnamen

Eigenschaften von Laufwerken

Das DriveInfo-Objekt bietet eine ganze Reihe von Eigenschaften. Mit den folgenden Anweisungen geben wir diese im Direktbereich aus:

For Each objDrive In objDrives
     Debug.print (objDrive.Name)
     Debug.Print("AvailableFreeSpace: " & objDrive.AvailableFreeSpace.ToString())
     Debug.Print("DriveFormat:        " & objDrive.DriveFormat.ToString())
     Debug.Print("DriveType:          " & objDrive.DriveType.ToString())
     Debug.Print("IsReady:            " & objDrive.IsReady.ToString())
     Debug.Print("RootDirectory:      " & objDrive.RootDirectory.ToString())
     Debug.Print("TotalFreeSpace:     " & objDrive.TotalFreeSpace.ToString())
     Debug.Print("TotalSize:          " & objDrive.TotalSize.ToString())
     Debug.Print("VolumeLabel:        " & objDrive.VolumeLabel.ToString())
Next objDrive    

Die Eigenschaft IsReady ist beispielsweise interessant für CD/DVD-Laufwerke. Ist keine CD oder DVD eingelegt, liefert IsReady den Wert False. Ein Zugriff auf Eigenschaften wie AvailableFreeSpace oder DriveFormat ist somit nicht möglich, Name oder DriveType hingegen funktionieren. Um beim Zugriff auf alle Laufwerke Ausnahmen zu verhindern, können Sie prüfen, ob das Laufwerk bereit ist und nur dann auf die Eigenschaften zugreifen, die bei nicht bereiten Laufwerken nicht zur Verfügung stehen. Dazu verwenden wir eine einfache If…Then-Bedingung:

For Each objDrive In objDrives
     Debug.print(objDrive.Name)
     Debug.Print("DriveType:          " & objDrive.DriveType.ToString())
     Debug.Print("IsReady:            " & objDrive.IsReady.ToString())
     Debug.Print("RootDirectory:      " & objDrive.RootDirectory.ToString())
     If (objDrive.IsReady) Then
         Debug.Print("AvailableFreeSpace: " & objDrive.AvailableFreeSpace.ToString())
         Debug.Print("DriveFormat:        " & objDrive.DriveFormat.ToString())
         Debug.Print("TotalFreeSpace:     " & objDrive.TotalFreeSpace.ToString())
         Debug.Print("TotalSize:          " & objDrive.TotalSize.ToString())
         Debug.Print("VolumeLabel:        " & objDrive.VolumeLabel.ToString())
     End If
Next objDrive

Praktischerweise geben Eigenschaften wie etwa DriveFormat nicht wie unter VBA nur die Zahlenwerte von Konstanten aus, sondern über die Funktion ToString() auch direkt entsprechende Zeichenketten. Benötigen Sie einmal den Zahlenwert, können Sie ToString() einfach weglassen.

Auf ein Verzeichnis zugreifen

Auf ein Verzeichnis greifen wir über das DirectoryInfo-Objekt zu. Dieses erstellen wir jeweils mit der New-Methode und übergeben der Konstruktor-Methode dabei den Namen des Verzeichnisses. Hier geben wir direkt die Eigenschaften als Kommentar hinter der jeweiligen Anweisung an:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar