Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
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:
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.
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: