6.3 Dateien und Verzeichnisse 

Zur dauerhaften Speicherung der Arbeitsdaten eines Programms stehen Dateien und Datenbanken zur Verfügung. Sie ermöglichen es, die Programmbenutzung zu beenden und zu einem späteren Zeitpunkt mit dem gleichen Status wieder fortzusetzen.
In diesem Abschnitt wird die einfache Form der Speicherung behandelt: das Schreiben in Textdateien und das Lesen aus Textdateien. Den Datenbanken ist das gesamte Kapitel 8 gewidmet.
System.IO
Es werden Objekte der Klassen FileStream, StreamWriter und StreamReader benötigt. Diese stehen im Namensraum System.IO zur Verfügung. Da dieser Namensraum nicht standardmäßig in Visual Basic-Programme eingebunden wird, müssen Sie ihn für die jeweilige Anwendung importieren.
6.3.1 Lesen aus einer Textdatei 

FileStream
Ein Objekt der Klasse FileStream wird für die Art des Zugriffs auf die Datei und zum Öffnen der Datei benötigt.
StreamReader
Ein Objekt der Klasse StreamReader dient zum Lesen der Datei-Inhalte. Im folgenden Beispiel (Projekt DateiLesen) werden alle Zeilen einer Textdatei gelesen und auf dem Bildschirm ausgegeben. Abbildung 6.14 zeigt den Inhalt der Textdatei. Das Ergebnis des Programms sehen Sie in Abbildung 6.15.
Abbildung 6.14 Eingabedatei »ein.txt«
Abbildung 6.15 Alle Zeilen gelesen
Imports System.IO Public Class Form1 Private Sub cmdLesen_Click(...) Handles ... Dim fs As New FileStream( "ein.txt", FileMode.Open) Dim sr As New StreamReader(fs) Dim zeile As String Do Until sr.Peek() = –1 zeile = sr.ReadLine() lblA.Text &= zeile & vbCrLf Loop sr.Close() End Sub End Class
Listing 6.14 Projekt »DateiLesen«
Zur Erläuterung:
- Mit der Anweisung Imports System.IO wird der entsprechende Namensraum eingebunden und mit all seinen Klassen zur Verfügung gestellt.
- Das Objekt fs wird als Objekt der Klasse FileStream erzeugt. Bei dem hier verwendeten Konstruktor werden dabei der Name der zu öffnenden Datei und der Öffnungsmodus benötigt.
Pfadangabe
- Der Name der Datei ein.txt steht in einer Zeichenkette. Wenn kein Pfad angegeben wird, so wird davon ausgegangen, dass die Datei im gleichen Verzeichnis wie die fertige Anwendung steht, hier also in ...\DateiLesen\bin\Debug. Befindet sich die Datei in einem anderen Verzeichnis, so kann der Pfad dorthin relativ (ausgehend vom aktuellen Verzeichnis) oder absolut (mit vollständiger Pfadangabe) angegeben werden.
Ausnahme
- Wird die Datei, aus der gelesen werden soll, nicht gefunden, so tritt eine Ausnahme auf. Diesen Fall gibt es in der Praxis häufig, beispielsweise aufgrund einer falschen Pfadangabe. Dieser wichtige Aspekt wird im übernächsten Projekt DateiSicherLesen berücksichtigt. Dort finden Sie auch Beispiele für relative und absolute Pfadangaben.
Open, Create, Append
- Es gibt eine Reihe von möglichen Öffnungsmodi. Sie stehen in der Enumeration FileMode. Die wichtigsten sind Open (zum Öffnen einer Datei, die Sie lesen möchten), Create (zum Öffnen einer Datei, die Sie neu beschreiben bzw. überschreiben möchten) und Append (zum Öffnen einer Datei, an deren Ende Sie weiterschreiben möchten).
- Das Objekt sr wird als Objekt der Klasse StreamReader erzeugt. Bei dem hier verwendeten Konstruktor wird dabei das Objekt der Klasse FileStream benötigt, aus dem gelesen werden soll.
- Bei einer Textdatei ist häufig unbekannt, wie viele Zeilen mit Text gefüllt sind. Möchten Sie alle Zeilen lesen, müssen Sie daher eine Do…Loop-Schleife verwenden. Diese muss beendet werden, sobald man an das Ende der Datei gelangt ist.
Peek()
- Die Methode Peek() der Klasse StreamReader prüft das nächste lesbare Zeichen einer Datei, ohne es einzulesen. Liefert die Methode den Wert –1 zurück, ist das Ende der Datei erreicht.
ReadLine()
- Die Methode ReadLine() der Klasse StreamReader liest eine Zeile bis zum nächsten Zeilenumbruch und liefert den Inhalt der Zeile (ohne den Zeilenumbruch) als String zurück.
Close()
- Die Methode Close() der Klasse StreamReader schließt den Eingabestream und die zugehörigen Ressourcen – in diesem Falle auch die Datei, aus der gelesen wurde. Das Schließen der Datei ist äußerst wichtig und darf nicht vergessen werden, da die Datei sonst je nach Ablauf für weitere Zugriffe gesperrt sein könnte.
6.3.2 Schreiben in eine Textdatei 

Zum Schreiben in eine Datei werden ein Objekt der Klasse StreamWriter und natürlich wieder ein Objekt der Klasse FileStream benötigt. Im folgenden Beispiel (Projekt DateiSchreiben) wird der Inhalt einer mehrzeiligen Textbox (Eigenschaft Multiline = True) vollständig in eine Textdatei geschrieben.
Abbildung 6.16 zeigt das Programm mit der Eingabe. Nach Betätigung des Buttons Schreiben sieht die Ausgabedatei aus wie in Abbildung 6.17.
Abbildung 6.16 Text zum Speichern
Abbildung 6.17 Ausgabedatei »aus.txt«
Imports System.IO Public Class Form1 Private Sub cmdSchreiben_Click(...) Handles ... Dim fs As New FileStream( "aus.txt", FileMode.Create) Dim sw As New StreamWriter(fs) sw.WriteLine(txtEingabe.Text) sw.Close() End Sub End Class
Listing 6.15 Projekt »DateiSchreiben«
Zur Erläuterung:
Create
- Bei der Erzeugung des Objekts der Klasse FileStream wird der Öffnungsmodus Create benutzt. Mit diesem Modus wird die Datei zum Schreiben geöffnet. Falls sie bereits existiert, wird sie ohne Rückfrage überschrieben.
Ausnahme
- Kann die Datei, in die geschrieben werden soll, nicht gefunden (falsche Pfadangabe) oder nicht beschrieben werden (Schreibschutz), tritt eine Ausnahme auf. Auch diesen Fall gibt es in der Praxis häufig. Im übernächsten Projekt DateiSicherSchreiben wird dieser wichtige Aspekt berücksichtigt.
WriteLine()
- Die Methode WriteLine() der Klasse StreamWriter schreibt den übergebenen String in die Datei und fügt einen Zeilenumbruch an. Falls kein zusätzlicher Zeilenumbruch angefügt werden soll, können Sie anstelle der Methode WriteLine() die Methode Write() verwenden.
- Das Multiline-Textfeld kann bereits einige Zeilenumbrüche beinhalten. Diese werden ebenfalls in der Datei gespeichert, bei WriteLine() und bei Write().
6.3.3 Sicheres Lesen aus einer Textdatei 

Wie bereits erwähnt, tritt eine Ausnahme auf, wenn die auszulesende Datei nicht gefunden wird, was durchaus vorkommen kann.
Im nachfolgenden Programm (Projekt DateiSicherLesen) werden zwei Lösungen zur Umgehung dieses Problems vorgestellt. Bei der ersten Lösung wird vorab die Existenz der Datei geprüft, bei der zweiten Lösung wird eine Ausnahmebehandlung durchgeführt. Zunächst die erste Lösung (in Abbildung 6.18 zu sehen).
Abbildung 6.18 Ausgabe bei falschem Dateinamen
Der Programmcode:
Imports System.IO Public Class Form1 Private Sub cmdExistenz_Click( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles cmdExistenz.Click Dim fs As FileStream Dim sr As StreamReader Dim dateiname As String = "ein.txt" Dim zeile As String If Not File.Exists(dateiname) Then MessageBox.Show("Datei " & dateiname & " existiert nicht") Exit Sub End If fs = New FileStream(dateiname, FileMode.Open) sr = New StreamReader(fs) Do Until sr.Peek() = –1 zeile = sr.ReadLine() lblA.Text &= zeile & vbCrLf Loop sr.Close() End Sub End Class
Listing 6.16 Projekt »DateiSicherLesen«, Existenz prüfen
Zur Erläuterung:
- Es werden zunächst nur zwei Objektverweise auf Objekte der Klasse FileStream und StreamReader erzeugt.
- Der Dateiname wird in einer String-Variablen gespeichert, da er mehrfach benötigt wird.
File, Exists()
- Die Klasse File stellt Elemente zur Information über Dateien und zur Bearbeitung von Dateien zur Verfügung. Die statische Methode Exists() prüft, ob eine angegebene Datei existiert. Weitere Möglichkeiten der Klasse File werden im Abschnitt 6.3.6 vorgestellt.
- In einer Verzweigung wird die Existenz der Eingabedatei ein.txt geprüft. Ist sie nicht vorhanden, wird False zurückgeliefert, eine Fehlermeldung ausgegeben und die Prozedur sofort verlassen.
- Existiert die Eingabedatei, werden zwei Objekte der Klasse FileStream und StreamReader erzeugt und den beiden bereits vorhandenen Objektverweisen zugewiesen.
- Anschließend kann die Datei wie gewohnt ausgelesen werden.
Es folgt die zweite Möglichkeit, mit der Ausnahmebehandlung, auch im Projekt DateiSicherLesen:
Imports System.IO Public Class Form1 [...] Private Sub cmdAusnahme_Click(...) Handles ... Dim fs As FileStream Dim sr As StreamReader Dim zeile As String Try fs = New FileStream( "ein.txt", FileMode.Open) sr = New StreamReader(fs) Do Until sr.Peek() = –1 zeile = sr.ReadLine() lblA.Text &= zeile & vbCrLf Loop sr.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class
Listing 6.17 Projekt »DateiSicherLesen«, Ausnahmebehandlung
Zur Erläuterung:
- Wie im ersten Fall werden nur zwei Objektverweise erzeugt.
Try…Catch
- Das restliche Programm steht in einem Try…Catch-Block, damit eine eventuell auftretende Ausnahme behandelt werden kann.
- Sofern die Datei nicht existiert, wird der Catch-Teil durchlaufen und eine Fehlermeldung ausgegeben: »Die Datei ... konnte nicht gefunden werden«.
relative Pfadangabe
Bei einer relativen Pfadangabe bewegt man sich ausgehend vom aktuellen Verzeichnis durch den Verzeichnisbaum. Ein Beispiel: "..\..\Daten\ein.txt" bezeichnet eine Datei, die man erreicht, wenn man vom aktuellen Verzeichnis zwei Ebenen nach oben und anschließend in das Unterverzeichnis Daten geht.
6.3.4 Sicheres Schreiben in eine Textdatei 

Eine Ausnahme tritt auch auf, falls die Datei, in die geschrieben werden soll, nicht gefunden werden kann (falsche Pfadangabe, siehe Abbildung 6.19) oder nicht beschrieben werden kann (Schreibschutz). Beide Fälle treten in der Praxis häufig auf.
Abbildung 6.19 Falsche Pfadangabe
Im folgenden Programm (Projekt DateiSicherSchreiben) wird dieses Problem mit einer Ausnahmebehandlung umgangen:
Imports System.IO Class Form1 Private Sub cmdAusnahme_Click(...) Handles ... Dim fs As FileStream Dim sw As StreamWriter Dim dateiname As String = "C:\Tmp\aus.txt" Try fs = New FileStream( dateiname, FileMode.Create) sw = New StreamWriter(fs) sw.WriteLine(txtEingabe.Text) sw.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class
Listing 6.18 Projekt »DateiSicherSchreiben«
Zur Erläuterung:
- Es wird versucht, in die Datei aus.txt im Verzeichnis C:\Tmp zu schreiben.
- Gelingt dies aus den oben geschilderten Gründen nicht, erfolgt eine Fehlermeldung.
- Anderenfalls wird der Inhalt des Textfelds vollständig in die Datei geschrieben.
6.3.5 Datei mit wahlfreiem Zugriff 

Random Access
Dateien mit wahlfreiem Zugriff (Random Access) bestehen aus einer Folge gleichartiger Datensätze. Ein Datensatz besteht in der Regel aus mehreren Komponenten. Jeder Datensatz kann direkt gelesen oder geschrieben werden. Daher ist der Zugriff schneller als bei den sequentiell gelesenen bzw. geschriebenen Textdateien aus den vorherigen Abschnitten.
Strings fester Länge
Hinweis: Im Unterschied zu älteren Versionen von Visual Basic ist es nicht notwendig, mit Strings oder Datensätzen fester Länge zu arbeiten. Aus Gründen der Kompatibilität zu anderen .NET-Sprachen kann man Strings fester Länge auch nur noch »über Umwege« erzeugen.
Im nachfolgenden Projekt DateiWahlfreierZugriff werden die folgenden Methoden genutzt:
- FileOpen(): zum Öffnen einer Datei im Modus Wahlfreier Zugriff.
- FileClose(): zum Schließen einer Datei.
- FilePutObject(): zum Schreiben eines Datensatzes an die gewünschte Stelle in der Datei.
- FileGetObject(): zum Lesen eines Datensatzes von der gewünschten Stelle in der Datei.
Als Beispiel werden Datensätze der Klasse Person in die Datei geschrieben bzw. aus ihr gelesen, siehe Abbildung 6.20.
Abbildung 6.20 Programm mit Originalwerten
Jedes Objekt dieser Klasse besitzt die Eigenschaften name, vorname, personalnummer, gehalt und geburtstag. Es folgt die Definition der Klasse in der Datei Person.vb:
Public Class Person Dim name As String Dim vorname As String Dim personalnummer As Integer Dim gehalt As Double Dim geburtstag As Date Sub Create(ByVal na As String, ByVal vn As String, ByVal pn As Integer, ByVal gh As Double, ByVal gb As Date) name = na vorname = vn personalnummer = pn gehalt = gh geburtstag = gb End Sub Sub Create(ByVal s As String) Dim teil() As String teil = s.Split(";") name = teil(0) vorname = teil(1) personalnummer = teil(2) gehalt = teil(3) geburtstag = teil(4) End Sub Function Merge() As String Merge = name & ";" & vorname & ";" & personalnummer & ";" & gehalt & ";" & geburtstag End Function Overrides Function ToString() As String ToString = name & " # " & vorname & " # " & personalnummer & " # " & gehalt & " # " & geburtstag End Function End Class
Listing 6.19 Projekt »DateiWahlfreierZugriff«, Klasse »Person«
Zur Erläuterung:
- Die Eigenschaften haben die Datentypen String, Integer, Double und Date.
- Die erste Methode Create() erwartet fünf Parameter und füllt damit die fünf Eigenschaften des Objekts.
- Die zweite Methode Create() erwartet eine Zeichenkette als einzigen Parameter, splittet diese anhand eines Trennzeichens in fünf Teile auf und füllt damit die fünf Eigenschaften des Objekts.
- Die Methode Merge() liefert die fünf Eigenschaften des Objekts für die Ausgabe in die Datei, jeweils getrennt durch ein Trennzeichen.
- Zu guter Letzt wird die Ausgabemethode ToString() aus der Basisklasse Object überschrieben. Sie liefert die fünf Eigenschaften des Objekts für die Ausgabe auf dem Bildschirm, jeweils getrennt durch mehrere Trennzeichen.
Es folgt der Beginn der Anwendungsklasse:
Imports System.IO Public Class Form1 Private Sub Form1_Load(...) Handles MyBase.Load AlleLesen() End Sub Private Sub cmdAlleLesen_Click(...) Handles ... AlleLesen() End Sub Private Sub AlleLesen() Dim p As New Person() Dim s As String Dim nr As Integer lstA.Items.Clear() If File.Exists("data.txt") Then FileOpen(1, "data.txt", OpenMode.Random) nr = 1 Do Try FileGetObject(1, s) p.Create(s) lstA.Items.Add(nr & ": " & p.ToString()) nr = nr + 1 Catch ex As Exception Exit Do End Try Loop FileClose(1) numLesen.Minimum = 1 numLesen.Maximum = nr – 1 numLesen.Value = 1 numSchreiben.Minimum = 1 numSchreiben.Maximum = nr numSchreiben.Value = nr Else lstA.Items.Add("Datei nicht vorhanden") End If End Sub [...] End Class
Listing 6.20 Projekt »DateiWahlfreierZugriff«, Beginn
Zur Erläuterung:
- Beim Start der Anwendung bzw. nach Betätigung des Buttons Alle lesen werden alle Datensätze aus der Datei gelesen und in der Listbox dargestellt. Zu diesem Zweck wird die Prozedur AlleLesen() aufgerufen.
- In dieser Prozedur wird ein zunächst leeres Objekt der Klasse Person erzeugt.
FileOpen()
- Falls die Datei mit den Personendaten existiert, dann wird sie mithilfe der Methode FileOpen() geöffnet. Diese erwartet hier drei Parameter:
- Eine frei wählbare Dateinummer, unter der die geöffnete Datei im weiteren Verlauf angesprochen werden kann.
- Den Namen der Datei, hier im Anwendungsverzeichnis liegend.
- Den Öffnungsmodus, hier Random für den wahlfreien Zugriff.
Random
FileGetObject()
- Innerhalb einer Schleife werden die einzelnen Datensätze mithilfe der Methode FileGetObject() aus der Datei gelesen. Diese Schleife wird verlassen, falls der Lesevorgang nicht erfolgreich war. Die Methode erwartet hier zwei Parameter:
- Die zuvor festgelegte Dateinummer.
- Ein Objekt eines elementaren Datentyps, hier ist dies das Objekt s des Datentyps String. Es können keine Objekte eigener Klassen oder benutzerdefinierter Datentypen genutzt werden.
- Nach dem Einlesen eines Datensatzes wird dieser mithilfe der Methode Create() zerlegt und mithilfe der Methode ToString() in die Listbox geschrieben.
- Nach dem Einlesen aller Datensätze wird die Datei mit FileClose() geschlossen.
- Die beiden Zahlenauswahlfelder zum direkten Lesen bzw. Schreiben von Datensätzen aus der Datei bzw. in die Datei werden auf passende Werte eingestellt:
- Das Maximum für das Zahlenauswahlfeld zum Lesen wird auf die aktuelle Anzahl Datensätze gestellt.
- Das Maximum für das Zahlenauswahlfeld zum Schreiben wird auf die aktuelle Anzahl Datensätze + 1 gestellt. Es kann also ein neuer Datensatz direkt ans Ende der Datei geschrieben werden. Es können aber auch Datensätze mitten in der Datei überschrieben werden.
Es folgen die Prozeduren zum direkten Lesen bzw. Schreiben von einzelnen Datensätzen:
Imports System.IO Public Class Form1 [...] Private Sub cmdLesen_Click(...) Handles ... Dim p As New Person() Dim s As String lstA.Items.Clear() FileOpen(1, "data.txt", OpenMode.Random) FileGetObject(1, s, numLesen.Value) p.Create(s) lstA.Items.Add(p.ToString()) FileClose(1) End Sub Private Sub cmdSchreiben_Click(...) Handles ... Dim p As New Person Dim na, vn As String Dim pn As Integer Dim gh As Integer Dim gb As Date If txtName.Text <> "" Then na = txtName.Text Else na = "-" If txtVorname.Text <> "" Then vn = txtVorname.Text Else vn = "-" If IsNumeric(txtPersonalnummer.Text) Then pn = txtPersonalnummer.Text Else pn = 0 If IsNumeric(txtGehalt.Text) Then gh = txtGehalt.Text Else gh = 0 If IsDate(txtGeburtstag.Text) Then gb = txtGeburtstag.Text Else gb = "01.01.1900" p.Create(na, vn, pn, gh, gb) FileOpen(1, "data.txt", OpenMode.Random) FilePutObject(1, p.Merge(), numSchreiben.Value) FileClose(1) AlleLesen() End Sub [...] End Class
Listing 6.21 Projekt »DateiWahlfreierZugriff«, einzelne Datensätze
Zur Erläuterung:
- Beim direkten Lesen eines einzelnen Datensatzes aus der Datei wird ebenfalls die Methode FileGetObject()genutzt, hier aber mit einem dritten Parameter: der Nummer des gewünschten Datensatzes. Diese Nummer wird dem Zahlenauswahlfeld entnommen, siehe Abbildung 6.21.
Abbildung 6.21 Lesen des Datensatzes 2
FilePutObject()
- Auch beim direkten Schreiben eines einzelnen Datensatzes in die Datei mithilfe der Methode FilePutObject() wird auf das zugehörige Zahlenauswahlfeld zugegriffen, um die gewünschte Nummer zu ermitteln.
Werte prüfen
- Zuvor wurde u. a. mithilfe der Methoden IsNumeric() und IsDate() festgestellt, ob der Benutzer gültige Werte in die Textfelder eingetragen hatte. Notfalls wird auf Standardwerte korrigiert, damit sich in jedem Fall ein gültiger Datensatz ergibt.
- Nach dem Schreiben eines Datensatzes werden wiederum alle Datensätze zur Aktualisierung der Benutzeroberfläche gelesen.
Als Letztes folgt die Prozedur zum Wiederherstellen der Originalwerte:
Imports System.IO Public Class Form1 [...] Private Sub cmdOriginalwerte_Click(...) Handles ... Dim p As New Person If File.Exists("data.txt") Then Kill("data.txt") FileOpen(1, "data.txt", OpenMode.Random) p.Create("Maier", "Hans", 6714, 3500, "15.03.1962") FilePutObject(1, p.Merge()) p.Create("Schmitz", "Peter", 81343, 3750, "12.04.1958") FilePutObject(1, p.Merge()) p.Create("Mertens", "Julia", 2297, 3621.5, "30.12.1959") FilePutObject(1, p.Merge()) FileClose(1) AlleLesen() End Sub End Class
Listing 6.22 Projekt »DateiWahlfreierZugriff«, Originalwerte
Zur Erläuterung:
- Hier wird die Methode FilePutObject() nur mit zwei Parametern aufgerufen, da die Datensätze einfach der Reihe nach in die Datei geschrieben werden.
- Die Methode File.Exists() stellt fest, ob eine Datei existiert. Mithilfe der Methode Kill() wird eine Datei ohne Rückfrage (!) gelöscht, siehe auch nächster Abschnitt.
6.3.6 Die Klassen File und Directory 

Die beiden Klassen File und Directory, ebenfalls aus dem Namensraum System.IO, bieten zahlreiche Möglichkeiten zur Information über Dateien und Verzeichnisse.
Im nachfolgenden Projekt DateiVerzeichnisListe, das sich über einige Abschnitte erstreckt, werden einige nützliche, statische Methoden dieser beiden Klassen eingesetzt:
- Directory.Exists(): Prüft die Existenz eines Verzeichnisses.
- Directory.SetCurrentDirectory(): Setzt das Verzeichnis, in dem die Windows-Anwendung arbeitet, neu.
- Directory.GetCurrentDirectory(): Ermittelt das Verzeichnis, in dem die Windows-Anwendung arbeitet.
- Directory.GetFiles(): Ermittelt eine Liste der Dateien in einem Verzeichnis.
- Directory.FileSystemEntries(): Ermittelt eine Liste der Dateien und Unterverzeichnisse in einem Verzeichnis.
- File.GetAttributes(): Ermittelt Attribute einer Datei oder eines Verzeichnisses (versteckt, Archiv usw.)
- File.GetCreationTime(): Ermittelt Datum und Uhrzeit der Erzeugung einer Datei oder eines Verzeichnisses.
- File.GetLastAccessTime(): Ermittelt das Datum des letzten Zugriffs auf eine Datei oder ein Verzeichnis.
- File.GetLastWriteTime(): Ermittelt Datum und Uhrzeit des letzten schreibenden Zugriffs auf eine Datei oder auf ein Verzeichnis.
Es wurde hier bewusst auf den Einsatz von Methoden verzichtet, die Dateien und Verzeichnisse verändern, wie z. B. File.Delete(), File. Move(), File.Replace(), Directory.Delete() oder Directory.Move(). Allzu leicht kann der Benutzer mit diesen Methoden unbeabsichtigt Dateien und Verzeichnisse dauerhaft verändern; sie sollten daher mit großer Vorsicht eingesetzt werden.
6.3.7 Das aktuelle Verzeichnis 

Zu Beginn des Programms wird das Startverzeichnis (C:\Temp) eingestellt und angezeigt (siehe Abbildung 6.22).
Abbildung 6.22 Startverzeichnis
Der zugehörige Code:
Imports System.IO Public Class Form1 Private Sub Form1_Load(...) Handles MyBase.Load If Directory.Exists("C:\Temp") Then Directory.SetCurrentDirectory("C:\Temp") Else MessageBox.Show("Das Verzeichnis" & " C:\Temp existiert nicht") End If lblCurDir.Text = Directory.GetCurrentDirectory() End Sub [...] End Class
Listing 6.23 Projekt »DateiVerzeichnisListe«, Start
Zur Erläuterung:
SetCurrentDirectory()
- Die Methode Directory.SetCurrentDirectory() setzt das aktuell benutzte Verzeichnis.
Exists()
- Vorher wird mit der Methode Directory.Exists() geprüft, ob das betreffende Verzeichnis existiert. Beide Methoden erwarten als Parameter eine Zeichenkette.
GetCurrentDirectory()
- Die Methode Directory.GetCurrentDirectory() liefert den Namen des aktuellen Verzeichnisses.
6.3.8 Eine Liste der Dateien 

Abbildung 6.23 zeigt die Ausgabe nach Betätigung des Buttons Dateiliste.
Abbildung 6.23 Dateiliste des Verzeichnisses C:\Temp
Der zugehörige Code:
Imports System.IO Public Class Form1 [...] Private Sub cmdDateiliste_Click(...) Handles ... Dim verzeichnis As String Dim dateiliste() As String Dim i As Integer verzeichnis = Directory.GetCurrentDirectory() dateiliste = Directory.GetFiles(verzeichnis) lstA.Items.Clear() For i = 0 To dateiliste.Count – 1 lstA.Items.Add(dateiliste(i)) Next End Sub [...] End Class
Listing 6.24 Projekt »DateiVerzeichnisListe«, Dateiliste
Zur Erläuterung:
- Die Variable verzeichnis wird mithilfe der Methode Directory.GetCurrentDirectory() auf das aktuelle Arbeitsverzeichnis gesetzt. Zu Beginn ist dies C:\Temp.
GetFiles()
- Die Methode Directory.GetFiles() liefert ein Feld von Strings. Die Variable dateiliste wurde als ein solches Feld (unbekannter Größe) deklariert und erhält den Rückgabewert der Methode zugewiesen.
- Mithilfe einer For-Schleife und der Feld-Eigenschaft Count wird das Listenfeld mit den Dateinamen gefüllt.
6.3.9 Eine Liste der Dateien und Verzeichnisse 

In Abbildung 6.24 erscheinen zusätzlich die Unterverzeichnisse.
Abbildung 6.24 Verzeichnis C:\Temp, Dateien und Verzeichnisse
Der nächste Teil des Programms lautet wie folgt:
Imports System.IO Public Class Form1 [...] Private Sub cmdSystemeinträge_Click(... ) Handles ... Systemeinträge() End Sub Private Sub Systemeinträge() Dim verzeichnis As String Dim dateiliste() As String Dim i As Integer verzeichnis = Directory.GetCurrentDirectory() dateiliste = Directory. GetFileSystemEntries(verzeichnis) lstA.Items.Clear() For i = 0 To dateiliste.Count – 1 lstA.Items.Add(dateiliste(i)) Next End Sub [...] End Class
Listing 6.25 Projekt »DateiVerzeichnisListe«, Systemeinträge
Zur Erläuterung:
- Die eigentliche Ausgabe wird in der allgemeinen Prozedur Systemeinträge() vorgenommen. Diese wird später noch von anderen Programmteilen genutzt.
GetFileSystemEntries()
- Die Methode Directory.GetFileSystemEntries() ist der Methode Directory.GetFiles() sehr ähnlich. Allerdings liefert sie nicht nur die Namen der Dateien, sondern auch die Namen der Verzeichnisse.
6.3.10 Informationen über Dateien und Verzeichnisse 

Im Folgenden werden einzelne Dateien bzw. Verzeichnisse genauer betrachtet, siehe Abbildung 6.25.
Abbildung 6.25 Information über die ausgewählte Datei
Der Programmcode:
Imports System.IO Public Class Form1 [...] Private Sub lstA_SelectedIndexChanged(... ) Handles lstA.SelectedIndexChanged Dim name As String If lstA.SelectedIndex <> –1 Then name = lstA.Text If File.GetAttributes(name) = FileAttributes.Directory Then lblAnzeige.Text = "Verzeichnis " Else lblAnzeige.Text = "Datei " End If lblAnzeige.Text &= name & vbCrLf & "Erzeugt: " & File.GetCreationTime(name) & vbCrLf & "Letzter Zugriff: " & File.GetLastAccessTime(name) & vbCrLf & "Letzter Schreibzugriff:" & File.GetLastWriteTime(name) Else MessageBox.Show("Kein Eintrag ausgewählt") End If End Sub [...] End Class
Listing 6.26 Projekt »DateiVerzeichnisListe«, Informationen
Zur Erläuterung:
- Hat der Benutzer in der Liste der Dateien (und ggf. Verzeichnisse) einen Eintrag ausgewählt, so werden einige Informationen zu den letzten Zugriffen angezeigt.
GetAttributes()
- Die Methode GetAttributes() der Klasse File liefert Informationen über die Attribute einer Datei bzw. eines Verzeichnisses, wie z. B. versteckt, schreibgeschützt, Archiv, Datei oder Verzeichnis. Diese Informationen können Sie mit Elementen der Enumeration FileAttributes vergleichen.
Get...Time()
- Die Methoden File.GetCreationTime(), File.GetLastAccessTime() und File.GetLastWriteTime() ermitteln die Daten der Erzeugung der Datei, des letzten Zugriffs auf die Datei und des letzten schreibenden Zugriffs auf die Datei.
6.3.11 Bewegen in der Verzeichnishierarchie 

Wählen Sie zunächst ein Unterverzeichnis aus, siehe Abbildung 6.26.
Abbildung 6.26 Auswahl
Wechseln Sie anschließend mit dem Button in Verzeichnis in das betreffende Unterverzeichnis oder mit dem Button nach oben in das übergeordnete Verzeichnis, siehe Abbildung 6.27.
Abbildung 6.27 Unterverzeichnis C:\Temp\Haus
Der letzte Teil des Programms lautet:
Imports System.IO Public Class Form1 [...] Private Sub cmdInVerzeichnis_Click(... ) Handles ... If lstA.SelectedIndex <> –1 Then If File.GetAttributes(lstA.Text) = FileAttributes.Directory Then Directory. SetCurrentDirectory(lstA.Text) Else MessageBox.Show(lstA.Text & " ist kein Verzeichnis") End If Else MessageBox.Show("Kein Eintrag ausgewählt") End If lblCurDir.Text = Directory.GetCurrentDirectory() Systemeinträge() End Sub Private Sub cmdNachOben_Click(...) Handles ... Directory.SetCurrentDirectory("..") lblCurDir.Text = Directory.GetCurrentDirectory() Systemeinträge() End Sub End Class
Listing 6.27 Projekt »DateiVerzeichnisListe«, Verzeichniswechsel
Zur Erläuterung:
- Falls der Benutzer in der Liste der Dateien und Verzeichnisse ein Verzeichnis ausgewählt hat und den Button in Verzeichnis betätigt, wird das aktuelle Arbeitsverzeichnis mit Directory.SetCurrentDirectory() gewechselt. Das aktuelle Verzeichnis wird angezeigt.
- Falls bei der Methode Directory.SetCurrentDirectory() als Verzeichnis .. eingetragen wird, findet ein Wechsel in das übergeordnete Verzeichnis statt.
- Nach einem Verzeichniswechsel wird die aktuelle Liste der Dateien und Verzeichnisse angezeigt.
- Auf diese Art und Weise kann man sich in der gesamten Verzeichnis-Hierarchie bewegen und sich die Inhalte der Verzeichnisse anzeigen lassen.