Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einführung
2 Grundlagen
3 Fehlerbehandlung
4 Erweiterte Grundlagen
5 Objektorientierte Programmierung
6 Wichtige Klassen in .NET
7 Weitere Elemente eines Windows-Programms
8 Datenbank-Anwendungen mit ADO.NET
9 Internet-Anwendungen mit ASP.NET
10 Zeichnen mit GDI+
11 Beispielprojekte
12 Windows Presentation Foundation
13 Windows Store-Apps für Windows 8
A Installation und technische Hinweise
B Lösungen der Übungsaufgaben
C Inhalt der Buch-DVD
D Der Autor
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
Einstieg in Visual Basic 2012 von Thomas Theis
Ideal für Programmiereinsteiger geeignet
Buch: Einstieg in Visual Basic 2012

Einstieg in Visual Basic 2012
Rheinwerk Computing
579 S., 3., aktualisierte und erweiterte Auflage 2013, brosch., mit DVD
24,90 Euro, ISBN 978-3-8362-1959-4
Pfeil 6 Wichtige Klassen in .NET
Pfeil 6.1 Klasse String für Zeichenketten
Pfeil 6.1.1 Eigenschaften der Klasse String
Pfeil 6.1.2 Trimmen
Pfeil 6.1.3 Splitten
Pfeil 6.1.4 Suchen
Pfeil 6.1.5 Einfügen
Pfeil 6.1.6 Löschen
Pfeil 6.1.7 Teilzeichenkette ermitteln
Pfeil 6.1.8 Zeichen ersetzen
Pfeil 6.1.9 Ausgabe formatieren
Pfeil 6.2 Datum und Uhrzeit
Pfeil 6.2.1 Eigenschaften von DateTime
Pfeil 6.2.2 Rechnen mit Datum und Uhrzeit
Pfeil 6.2.3 DateTimePicker
Pfeil 6.3 Dateien und Verzeichnisse
Pfeil 6.3.1 Lesen aus einer Textdatei
Pfeil 6.3.2 Schreiben in eine Textdatei
Pfeil 6.3.3 Sicheres Lesen aus einer Textdatei
Pfeil 6.3.4 Sicheres Schreiben in eine Textdatei
Pfeil 6.3.5 Datei mit wahlfreiem Zugriff
Pfeil 6.3.6 Die Klassen File und Directory
Pfeil 6.3.7 Das aktuelle Verzeichnis
Pfeil 6.3.8 Eine Liste der Dateien
Pfeil 6.3.9 Eine Liste der Dateien und Verzeichnisse
Pfeil 6.3.10 Informationen über Dateien und Verzeichnisse
Pfeil 6.3.11 Bewegen in der Verzeichnishierarchie
Pfeil 6.4 Rechnen mit der Klasse Math
Pfeil 6.5 Zugriff auf MS Office
Pfeil 6.5.1 MS Word Datei erstellen
Pfeil 6.5.2 MS Excel Datei erstellen
Pfeil 6.6 Formular drucken
Pfeil 6.6.1 Druck und Seitenvorschau
Pfeil 6.6.2 Druckeinstellungen

Rheinwerk Computing - Zum Seitenanfang

6.3 Dateien und VerzeichnisseZur nächsten Überschrift

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, »Datenbank-Anwendungen mit ADO.NET« gewidmet.

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.


Rheinwerk Computing - Zum Seitenanfang

6.3.1 Lesen aus einer TextdateiZur nächsten ÜberschriftZur vorigen Überschrift

Ein Objekt der Klasse FileStream wird für die Art des Zugriffs auf die Datei und zum Öffnen der Datei benötigt.

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.16 zeigt den Inhalt der Textdatei. Das Ergebnis des Programms sehen Sie in Abbildung 6.17.

Abbildung

Abbildung 6.16 Eingabedatei »ein.txt«

Abbildung

Abbildung 6.17 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.16 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.

Rheinwerk Computing - Zum Seitenanfang

6.3.2 Schreiben in eine TextdateiZur nächsten ÜberschriftZur vorigen Überschrift

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.18 zeigt das Programm mit der Eingabe. Nach Betätigung des Buttons Schreiben sieht die Ausgabedatei aus wie in Abbildung 6.19.

Abbildung

Abbildung 6.18 Text zum Speichern

Abbildung

Abbildung 6.19 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.17 Projekt »DateiSchreiben«

Zur Erläuterung:

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

Rheinwerk Computing - Zum Seitenanfang

6.3.3 Sicheres Lesen aus einer TextdateiZur nächsten ÜberschriftZur vorigen Überschrift

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.20 zu sehen).

Abbildung

Abbildung 6.20 Ausgabe bei falschem Dateinamen

Der Programmcode:

Imports System.IO
Public Class Form1
Private Sub cmdExistenz_Click(...) Handles ...
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.18 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.
  • 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 in 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.19 Projekt »DateiSicherLesen«, Ausnahmebehandlung

Zur Erläuterung:

  • Wie im ersten Fall werden nur zwei Objektverweise erzeugt.
  • 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«.

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. Dieses Beispiel würde allerdings im vorliegenden Projekt nicht zum Erfolg führen, da es dieses Verzeichnis nicht gibt. Falls Sie den Button Pfad betätigen (siehe Abbildung 6.20), sehen Sie das entsprechende Ergebnis.


Rheinwerk Computing - Zum Seitenanfang

6.3.4 Sicheres Schreiben in eine TextdateiZur nächsten ÜberschriftZur vorigen Überschrift

Eine Ausnahme tritt auch auf, falls die Datei, in die geschrieben werden soll, nicht gefunden werden kann (falsche Pfadangabe, siehe Abbildung 6.21) oder nicht beschrieben werden kann (Schreibschutz). Beide Fälle treten in der Praxis häufig auf.

Abbildung

Abbildung 6.21 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.20 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.

Rheinwerk Computing - Zum Seitenanfang

6.3.5 Datei mit wahlfreiem ZugriffZur nächsten ÜberschriftZur vorigen Überschrift

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.

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

Abbildung

Abbildung 6.22 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(na As String, vn As String, pn As Integer,
gh As Double, gb As Date)
name = na
vorname = vn
personalnummer = pn
gehalt = gh
geburtstag = gb
End Sub

Sub Create(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.21 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.22 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.
  • 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
  • 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.23 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.23.

Abbildung

Abbildung 6.23 Lesen des Datensatzes 2

  • 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.
  • 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.24 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.

Rheinwerk Computing - Zum Seitenanfang

6.3.6 Die Klassen File und DirectoryZur nächsten ÜberschriftZur vorigen Überschrift

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


Rheinwerk Computing - Zum Seitenanfang

6.3.7 Das aktuelle VerzeichnisZur nächsten ÜberschriftZur vorigen Überschrift

Zu Beginn des Programms wird das Startverzeichnis (C:\Temp) eingestellt und angezeigt (siehe Abbildung 6.24).

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.25 Projekt »DateiVerzeichnisListe«, Start

Zur Erläuterung:

  • Die Methode Directory.SetCurrentDirectory() setzt das aktuell benutzte Verzeichnis.
  • Vorher wird mit der Methode Directory.Exists() geprüft, ob das betreffende Verzeichnis existiert. Beide Methoden erwarten als Parameter eine Zeichenkette.
  • Die Methode Directory.GetCurrentDirectory() liefert den Namen des aktuellen Verzeichnisses.

Abbildung

Abbildung 6.24 Startverzeichnis


Rheinwerk Computing - Zum Seitenanfang

6.3.8 Eine Liste der DateienZur nächsten ÜberschriftZur vorigen Überschrift

Abbildung 6.25 zeigt die Ausgabe nach Betätigung des Buttons Dateiliste.

Abbildung

Abbildung 6.25 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.26 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.
  • 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.

Rheinwerk Computing - Zum Seitenanfang

6.3.9 Eine Liste der Dateien und VerzeichnisseZur nächsten ÜberschriftZur vorigen Überschrift

Der nächste Teil des Programms nimmt zusätzlich die Unterverzeichnisse in die Liste auf und lautet wie folgt (siehe Abbildung 6.26):

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.27 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.
  • 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.

Abbildung

Abbildung 6.26 Verzeichnis C:\Temp, Dateien und Verzeichnisse


Rheinwerk Computing - Zum Seitenanfang

6.3.10 Informationen über Dateien und VerzeichnisseZur nächsten ÜberschriftZur vorigen Überschrift

Im Folgenden werden einzelne Dateien bzw. Verzeichnisse genauer betrachtet, siehe Abbildung 6.27.

Abbildung

Abbildung 6.27 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

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.28 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.
  • 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.

Rheinwerk Computing - Zum Seitenanfang

6.3.11 Bewegen in der VerzeichnishierarchieZur vorigen Überschrift

Wählen Sie zunächst ein Unterverzeichnis aus, siehe Abbildung 6.28.

Abbildung

Abbildung 6.28 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.29.

Abbildung

Abbildung 6.29 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
Try
Directory.SetCurrentDirectory(lstA.Text)
Catch
MessageBox.Show(lstA.Text & " ist kein Verzeichnis")
End Try
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.29 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 Verzeichnis mit Directory.SetCurrentDirectory() gewechselt. Das neue Verzeichnis wird angezeigt.
  • Falls der Benutzer eine Datei zum Verzeichniswechsel ausgewählt hat, wird eine entsprechende Fehlermeldung angezeigt.
  • 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.


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Einstieg in Visual Basic 2012

Einstieg in Visual Basic 2012
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Visual Basic 2012






 Visual Basic 2012


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Rheinwerk-Shop: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Rheinwerk-Shop: Einstieg in Python






 Einstieg in Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern