Arbeit mit Diskette/Festplatte

Lesen und Schreiben | Beispiel: Meßwertdatei auf Datenträger schreiben | Beispiel: Meßwertdaten von Datenträger lesen

Fast alles, was man in DOS oder Windows mit Datenträgern anstellen kann, kann man auch in Visual Basic tun.
Die meisten Befehle erklären sich selbst, deshalb genügt hier vielleicht eine Tabelle.

ChDir "VzNam"Das Verzeichnis VzNam wird zum aktiven Verzeichnis
ChDrive "LW"Stellt aktives Laufwerk ein, LW steht für den Laufwerksbuchstaben
CurDir ()liefert den aktiven Verzeichnispfad als String
Dir (VzNam[, Attribut])Directory-Anzeige, VzNam ist die Verzeichnisangabe, ggf. mit Pfad und Suchmaske. Wildcards (* und ?) sind erlaubt. Der erste Aufruf muß mit Klammer erfolgen, weitere ohne. Es wird bei jedem Aufruf nur eine Datei gemeldet.
FileAttr (Num, RetType)ermittelt Art des Zugriffs auf eine geöffnete Datei, Num ist die bei Öffnung vergebene Nummer, RetType die Zugriffsart
FileCopy "Quelle", "Ziel"Eine Datei wird kopiert, Zielort und Zielname frei wählbar
FileDateTime (DatNam)ermittelt Speicherdatum/Speicherzeit der Datei DatNam
FileLen (DatNam)Länge der ungeöffneten Datei DatNam in Bytes
FreeFileliefert nächste freie Dateinummer für Open
GetAttr (DatNam)liefert die Dateiattribute der Datei DatNam zurück
Kill "DatNam"Die Datei(en) namens DatNam wird/werden gelöscht. Mehrere Dateien werden mit Wildcards (*,?) adressiert
LOF (DatNum)Länge der unter der Nummer DatNum geöffneten Datei
MkDir "VzNam"Legt ein Verzeichnis an, VzNam steht für den den Verzeichnisnamen, ggf. inklusive Pfad
Name "alt" As "neu"Umbenennung eines Verzeichnisses oder einer Datei
RmDir "VzNam"Löschung des Verzeichnisses VzNam; es muß leer sein!
SetAttr (DatNam, Attr)setzt Dateiattribute der Datei DatNam. Zulässige Werte sind ReadOnly = 1, Hidden = 2, System = 4, Archiv = 32. Angegeben wird in Attr die Wertekombination als Summe der Zahlen


Lesen und Schreiben

Der Zugriff auf Disketten oder die Festplatte ist einfach zu bewerkstelligen. Voraussetzung ist die Auswahl eines Laufwerkes, eines Ordners, eines Dateinamens. Dies kann, wenn sie nicht ein für allemal festliegen, mit Hilfe eines Standarddialogs erfolgen.
Der eigentliche Zugriff muß dann programmiert werden. Wie er erfolgt, hängt davon ab, um welche Art von Datei es sich handelt. Es könnte eine einfache Textdatei sein ("sequentieller Zugriff"), eine Datei, die Datensätze enthält ("Random-Zugriff") oder eine Binärdatei, die Byte für Byte bearbeitet werden muß ("Binärer Zugriff").

Der Zugriff auf Dateien verläuft immer nach einem festen Schema:

1. Schritt: Öffnen
Der allgemeine Befehl dazu lautet

Open Pfadname For Modus [Access Zugriff] [Sperre] As [#]Dateinummer [Len=Satzlänge]

Einträge in eckigen Klammern können entfallen. Die Einträge bedeuten:

Pfadnameist klar, wird ggf. im Standarddialog ausgewählt
Modusmöglich sind: Append, Binary, Input, Output oder Random
Zugriffdie Art kann festgelegt werden. Möglich sind: Read, Write, Read Write
Sperrekann festgelegt werden, und betrifft Zugriffe anderer Prozesse auf die Datei. Möglich sind: Shared, Lock Read, Lock Write, Lock Read Write
Dateinummerkennzeichnet den Zugriffskanal. Zulässig sind Nummern von 1 bis 511. Freie Nummern können mit einer speziellen Funktion (FreeFile) erfragt werden.
Satzlängekann angegeben werden. Es geht um die Zahl der auf einen Rutsch transportierbaren Bytes. Maximal zulässig sind 32767. Besser weglassen, weil es Probleme geben kann, wenn man die Satzlänge zu klein wählt.

2. Schritt: Die Lese- bzw. Schreibarbeit
Je nach Dateiart kann dieser Teil sehr unterschiedlich aussehen. Es ist sicher gut, eine Befehlsübersicht zu geben.

Positionier- und Steuerbefehle

EOF(DatNum)Binäre Konstante, die das Dateiende anzeigt
Seek #DatNum[, SatzNum]gibt in einer Random-Datei die Position des nächsten zu verarbeitenden satzes, bzw. legt die Position fest
Loc #DatNumgibt in Random-Dateien die Datensatznummer des zuletzt bearbeiteten Satzes an
Width #DatNum, Längedie Länge der Ausgabezeile wird festgelegt
Lock #DatNum, SatzNumverhindert Fremdzugriffe auf einen Datensatz bzw. einen Bytenummer mit "Num1 To Num2" auf einen Bereich von Datensätzen bzw. Bytes.
Unlock #DatNum, SatzNumhebt die mit Lock erklärte Sperre auf

Lesebefehle

Input #DatNum, Variable[1, Variable2,..]Lesen einer sequentiellen Datei. DatNum steht in der Tabelle für Dateinummer. Der gelesene Inhalt wird "Variable" bzw. den Variablen zugewiesen
Line Input #DatNum, VariableLiest in einer sequentiellen Datei eine ganze Zeile
Get #DatNum, [SatzNum], VariableLiest je nach Dateiart einen Datensatz oder ein Byte

Schreibbefehle

Print #DatNum,VariableSchreibt zeilenweise in sequentielle Datei, es werden keinen Trennzeiche ausgegeben, Anführungsstriche fallen weg. Variable steht für einen String oder Liste von Strings
Write #DatNum, VariableSchreibt zeilenweise in sequentielle Datei
Put #DatNum, [SatzNum,] Variableschreibt in Random- oder Binäre Dateien. Ohne Angabe der Satznummer wird an die nächstbeste Stelle (Quatsch: Die "dranne") geschrieben, sonst entsprechend positioniert

Schritt 3: Schließen
Wenn die Arbeit getan ist, müssen zuvor geöffnete Dateien geschlossen werden. Die Befehle dazu sind: Close, mit oder ohne Dateinummer und Reset. Close ohne Nummer und Reset schließen alle geöffneten Dateien.
Wenn's geht, nicht vergessen!

Wichtig: Da Diskettenzugriffe nicht immer Erfolg haben, sollten alle Dateiroutinen von einer Fehlerbehandlung eingerahmt werden, wie sie im Beispielcode zu den Standarddialogen vorgesehen ist.


Beispiel: Meßwertdatei auf Datenträger schreiben

Im Code-Beispiel des Standarddialogs für den hier interessierenden Fall "Speichern/Speichern unter" ist ein Unterprogrammaufruf enthalten, der dort "Daten_Speichern(CmDialog.File_Name)" heißt. Um diese Routine, die dort nicht angegeben worden war, geht es jetzt.

Dim Anzahl As Integer, X(50) As Single, Y(50) As Single

Sub Daten_Speichern(dateibez As String)
Dim i As Integer
Open dateibez For Output As 100
Write #100, Anzahl
For i = 1 To Anzahl
Write #100, X(i)
Write #100, Y(i)
Next
Close 100
End Sub

Fangen wir mit der Erläuterung oben an:
Der Code enthält Dimensionierungsangaben, die irgendwo im Kopf des Formulars oder des Moduls stehen müssen.
Der Name des Unterprogramms ist frei gewählt, in der Klammer ist der Name (inclusive Pfad) der Datei gemeint, die geschrieben werden soll.
Die Variable i wird Zähler für das Beispiel: Ich nehme mal an, daß im Programm eine "Anzahl" von Wertepaaren (z.B. Meßwerten) vorliegt, die in zwei Arrays abgelegt sind. Diese heißen hier X(i) und Y(i).
Mit dem "Open"-Befehl geht es richtig los. Geöffnet wird die Datei namens "dateibez", dies wird so im Routinenkopf als "Parameter übergeben". Die 100, die überall auftaucht, ist eine frei wählbare Dateinummer, an der das Programm die gemeinte Datei "erkennt". Da Windows viele Dateien parallel verwalten kann, erhält jede eine eigene Nummer. Mehrere Dateien können deshalb auch wild durcheinander beschrieben werden. Theoretisch könnte die Nummer "besetzt" sein. In der Hoffnung, keinen "Treffer" zu landen, wählt man nicht 1, 2 oder 3, sondern eben eine höhere Zahl.
Es folgt die eigentliche Schreiberei.
Schließlich folgt "Close" zum Schließen.
Dies war's!
Übrigens läßt sich die gespeicherte Datei mit Wordpad z.B. lesen und auch verändern. Gucken Sie selbst nach!


Beispiel: Meßwertdaten von Datenträger lesen

Das Gegenstück, zum Lesen der Datei läßt sich jetzt schneller abhandeln. Nehmen wir an, mit einem Standarddialog sei die Dateiauswahl erfolgt, die wieder in dateibez den Pfad der zu lesenden Datei ergeben hat. Nun folgt:

Dim Anzahl As Integer, X(50) As Single, Y(50) As Single

Sub Daten_Lesen(dateibez As String)
Open dateibez For Input As 101
Input #101, Anzahl
For i = 1 To Anzahl
Input #101, X(i)
Input #101, Y(i)
Next
Close 101
End Sub

Die Datei wird diesmal mit den Schlüsselworten "For Input" geöffnet, wir wollen ja etwas lesen. Der Rest ist wie oben beim Schreiben.


© R. Hirte * 2000