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 |
| FreeFile | liefert 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 |
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:
| Pfadname | ist klar, wird ggf. im Standarddialog ausgewählt |
| Modus | möglich sind: Append, Binary, Input, Output oder Random |
| Zugriff | die Art kann festgelegt werden. Möglich sind: Read, Write, Read Write |
| Sperre | kann festgelegt werden, und betrifft Zugriffe anderer Prozesse auf die Datei. Möglich sind: Shared, Lock Read, Lock Write, Lock Read Write |
| Dateinummer | kennzeichnet den Zugriffskanal. Zulässig sind Nummern von 1 bis 511. Freie Nummern können mit einer speziellen Funktion (FreeFile) erfragt werden. |
| Satzlänge | kann 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 #DatNum | gibt in Random-Dateien die Datensatznummer des zuletzt bearbeiteten Satzes an |
| Width #DatNum, Länge | die Länge der Ausgabezeile wird festgelegt |
| Lock #DatNum, SatzNum | verhindert Fremdzugriffe auf einen Datensatz bzw. einen Bytenummer mit "Num1 To Num2" auf einen Bereich von Datensätzen bzw. Bytes. |
| Unlock #DatNum, SatzNum | hebt 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, Variable | Liest in einer sequentiellen Datei eine ganze Zeile |
| Get #DatNum, [SatzNum], Variable | Liest je nach Dateiart einen Datensatz oder ein Byte |
Schreibbefehle
| Print #DatNum,Variable | Schreibt 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, Variable | Schreibt zeilenweise in sequentielle Datei |
| Put #DatNum, [SatzNum,] Variable | schreibt 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.
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 End SubClose 100 |
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!
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 End SubClose 101 |
Die Datei wird diesmal mit den Schlüsselworten "For Input" geöffnet, wir wollen ja etwas lesen. Der Rest ist wie oben beim Schreiben.