Dem GEMDOS auf der Spur, Teil 3

In diesem Teil beschäftigen wir uns mit dem wichtigsten Bestandteil des GEMDOS: der Verwaltung und dem Zugriff auf Dateien. Dabei gehen wir auf die interne Datei-Organisation des GEMDOS ein und besprechen die von verschiedenen Treibern implementierten Netzwerkfunktionen.

Auf dem Niveau des GEMDOS muß sich der Programmierer nicht mehr um Sektoren, Cluster oder die FAT kümmern - diese Arbeit übernimmt GEMDOS. Es ist im wesentlichen unerheblich, ob es sich bei dem Datenmedium um ein Diskettenlaufwerk, eine Festplatte oder etwa ein magneto-optisches Laufwerk handelt. Die Dateifunktionen des GEMDOS lassen sich in die folgenden vier Bereiche einordnen: Öffnen und Schließen einer Datei, Dateizugriffe, Dateien im Netzwerk, Datei löschen, umbenennen und so weiter.

GEMDOS arbeitet auf Dateiebene. Bevor Sie jedoch eine Datei auslesen beziehungsweise beschreiben können, müssen Sie zunächst Ihr Vorhaben GFMDOS mitteilen, indem Sie die gewünschte Datei »öffnen«. Dazu gibt es zwei Funktionen, »Fcreate()« (GEMDOS $3c) und »Fopen()« (GEMDOS $3d). Mit »Fcreate« erzeugen Sie eine neue, leere Datei; existiert bereits eine Datei mit gleichen Namen, so löscht GEMDOS ihren Inhalt. Als Parameter erwartet »Fcreate« den Dateipfad und die in einem Wort zusammengefaßten Dateiattribute (siehe Tabelle 1 ). Der Dateipfad setzt sich aus der Laufwerkskennung (»C:\«), dem Pfad (»ORDNER1\ORDNER2\«), dem Namen (»TEST«) und der Endung der Datei (».TXT«) zusammen. Übergeben Sie lediglich den Dateinamen und deren Endung, geht GEMDOS davon aus, daß Sie sich auf das aktuelle Laufwerk und den aktuellen Pfad beziehen.

Die Dateiattribute beschreiben den Charakter der neuen Datei. Sie setzen sich aus den unteren vier Bit zusammen, wobei jedes Bit eine Eigenschaft der Datei repräsentiert. Bit 0 besagt, ob die Datei schreibgeschützt sein soll (1) oder nicht (0). Ist Bit 1 gesetzt, so ist die Datei versteckt, das heißt sie ist im Dateifenster des Desktops nicht sichtbar. Über Bit 2 bestimmen Sie, ob die neue Datei eine Systemdatei sein soll; das Vorbild von GEMDOS - MS-DOS - markiert die Betriebssystemdateien »IO.SYS« und »MSDOS.SYS« als Systemdateien. Mit Bit 3 erzeugen Sie einen Diskettennamen. Kann die Fcreate()-Funktion die gewünschte Datei nicht anlegen, so erhalten Sie als Ergebnis einen negativen Wert als Fehlermeldung, den Sie entsprechend der Tabelle 3 interpretieren. Ansonsten ist das Ergebnis eine sogenannte Dateikennung - in der Fachwelt als »file handle« oder Dateikanal bezeichnet.

GEMDOS ist in der Lage, zur selben Zeit mehrere Dateien offen zu haben. Zur Identifizierung vergibt GEMDOS jeder geöffneten Datei eine individuelle Kennung, über die das Programm auf sie zugreifen kann. Im Gegensatz zu Fcreate() dient die Fopen()-Funktion zum Öffnen einer bereits vorhandenen Datei. Sie erwartet als Parameter den Dateipfad und den sogenannten Zugriffsmodus. Der Dateiname darf bei Fopen( auch ein sogenanntes Dateimuster sein, etwa »RUFUS*.PRG«. Das »« ist dabei ein Platzhalter für eine beliebige Anzahl von Zeichen. Zudem gibt es noch das »?«-Zeichen, das für ein beliebiges Zeichen steht. Das Muster »TEST.PI?« trifft etwa auf die Dateien »TEST001.PI1«, »TESTDREI.PIA«, »TEST.PI« zu. Bei der Verwendung von Dateimustern bei Fopen() sollten Sie beachten, daß GEMDOS stets die erste passende Datei öffnet. Über den Zugriffsmodus teilen Sie GEMDOS mit, ob Sie die Datei nur lesen (0), nur beschreiben (1) oder lesen und beschreiben (2) wollen.

Bit Bezeichnung Bedeutung
0 READ ONLY Datei ist schreibgeschützt
1 HIDDEN Datei ist versteckt
2 SYSTEM Systemdatei
3 VOLUME Datei dient als Diskettenname
4 SUBDIR Eintrag ist Unterverzeichnis
5 ARCHIVE Datei ist archiviert

Tabelle 1: Die Dateiattribute

Ein- und Ausgabekanäle

Neben der Kategorie der Dateikanäle, denen GEMDOS Werte größer 5 zuordnet, gibt es weitere Arten von Kanälen, über die Sie Daten ein- und ausgeben. Die Kanäle mit den Kennungen kleiner 0 sind für die Zeichen-orientierten Geräten reserviert: Der Bildschirm/Tastatur (»CON:«) liegt auf Kanal -1, der RS232-Port (»AUX:«) auf -2 und der Druckerport (»PRN:«) auf -3. Um diese Geräte anzusprechen gibt es zwei Wege: Sie verwenden die den Geräten zugeordneten Kanäle für die Ein-/Ausgabe direkt, oder Sie öffnen eine Datei mit den Gerätenamen als Dateiname, etwa:

Fopen( "PRN:",1);

Eine dritte Kategorie sind die Standard-Kanäle: Kanal 0 ist die Standardeingabe (Tastatur), 1 die Standardausgabe (Bildschirm), 2 der Standardfehlerkanal (Bildschirm). Die Kanäle 3 und 4 stehen für die serielle Schnittstelle und den Drucker. Die Besonderheit der Standardkanäle ist, daß die ihnen zugeordneten Geräte nicht fest sind. Über die Funktion »Fforce()« (GEMDOS $46) weisen Sie einem Standardkanal einen anderen Kanal - etwa eine Dateikennung - zu; dieser darf allerdings nicht ein weiterer Standardkanal sein. Dabei sind die oben in Klammern stehenden Geräte die Voreinstellung. Mit »Fforce(1,filehandle);« legen Sie etwa die Standardausgabe in die Datei mit der Kennung »filehandle« um. Beachten Sie, daß ein Programm die Standardkanal-Einstellung des übergeordneten Programmes erhält.

Die Standardkanäle nehmen den textorientierten Programmen (».TOS«) die Entscheidung ab, welche Geräte für die Ein- und Ausgabe verantwortlich sind. Saubere Programme sollten dafür die Kanäle 0 und 1 verwenden. Somit ist es für ein übergeordnetes Programm (etwa der Shell) kein Problem, die Ausgabe auf den Drucker (Fforce(1,-3);) oder in eine Datei (Fforce(1,filehandle;)) umzuleiten. Über die »Fdup()«-Funktion (GEMDOS $45) erhalten Sie eine Kennung größer 5, die den übergebenen Standardkanal bezeichnet.

Dateioperationen

Nachdem wir nun erfolgreich eine Datei geöffnet haben, steht nichts mehr in) Wege, um die Datei zu beschreiben oder Daten aus ihr zu lesen. Dazu stellt uns GEMDOS drei Funktionen zur Verfügung: »Fread«, »Fwrite« und »Fseek«. Mit »Fread()« (GEMDOS $3f) lesen Sie eine bestimmte Anzahl Bytes aus der Datei in den Speicher. Als Parameter übergeben Sie lediglich die Dateikennung (Wort), die Anzahl der zu lesenden Bytes (Langwort) und die Zieladresse. Wollen Sie die gesamte Datei einlesen, so geben Sie als Anzahl $ffffffff an. Als Ergebnis erhalten Sie entweder eine negative Fehlernummer oder die Anzahl der tatsächlich gelesenen Bytes zurück.

Das Gegenstück zu Fread() ist »Fwrite()«. Mit dieser Funktion schreiben Sie die angegebene Anzahl Bytes ab der Startadresse in die Datei. Als Ergebnis erhalten Sie auch hier entweder eine Fehlernummer oder die Anzahl der tatsächlich geschriebenen Byte. Vergleichen Sie immer die Anzahl der tatsächlich geschriebenen Bytes mit dem Sollwert, da die Funktion Platzmangel auf einem Laufwerk nicht als Fehler interpretiert.

Durch die Lese- beziehungsweise Schreiboperation bewegt GEMDOS auch den sogenannten Dateizeiger um die Anzahl der gelesenen Bytes weiter. Der Dateizeiger ist ein Offset zum Dateianfang, der GEMDOS als Schreib/Lesemarke dient. Bei einem weiteren Lese- oder Schreibzugriff würde GEMDOS die Daten ab der dort gespeicherten Position in der Datei lesen beziehungsweise schreiben. Beim Öffnen der Datei zum Lesen setzt GEMDOS den Dateizeiger stets auf den Anfang der Datei (Offset 0); beim Schreiben stets an das Dateiende.

Um gezielt Daten aus einer Datei zu lesen oder Daten an eine bestimmte Position zu schreiben, gibt es die »Fseek()«-Funktion (GEMDOS $42). Sie setzt den Dateizeiger auf einen von Ihnen bestimmten Offset. Dazu übergeben Sie drei Parameter: Einen vorzeichenbehafteten Offset (Langwort), die Dateikennung und ein Moduswort, das die Art der Positionierung bestimmt. Ist es 0, so gilt der angegebene Offset relativ zum Dateianfang. Bei 1 ist der Offset relativ zur aktuellen Position und bei 2 relativ zum Dateiende. Das Vorzeichen des Offset gibt die Richtung an: Positive Werte bewegen den Dateizeiger in Richtung Dateiende, negative Werte bewegen ihn in Richtung Anfang.

Mit diesen drei Funktionen organisieren Sie bereits eine Datenbank. Angenommen ein Datensatz hätte die Länge datlen = 100, so springen Sie mit der C-Anweisung

Fseek ((long) datlen, *(long) recno, handle, 0);

an den Datensatz mit der Nummer recno. Die Anweisung

Fread(handle, (long)datlen, datensatz) ;

liest den Datensatz in den Speicher ab Adresse »datensatz«. Nachdem alle Dateioperationen getätigt sind und Sie die Datei nicht weiter benötigen, sollten Sie sie wieder schließen. Dazu rufen Sie die Funktion »Fclose« (GEMDOS $4e) auf und übergeben als Parameter die Dateikennung.

Zur Veranschaulichung der Dateifunktionen finden Sie auf der TOS-Diskette die zwei Quelltexte »DEGASWR.C« (C) und »DEGASRD.S« (Assembler). Das C-Programm schreibt den aktuellen Bildschirmspeicher im Degas-Format ab, das Assembler-Programm liest ein Degasbild in den Bildschirmspeicher.

Netzwerkfunktionen

Für den geregelten und unkomplizierten Netzwerkbetrieb stellt das GEMDOS - genauer gesagt der installierte Netzwerktreiber - noch weitere Dateifunktionen zur Verfügung: Zunächst erhalten Sie durch die »Nversion«-Funktion (GEMDOS 96) die Kennung des angeschlossenen Netzwerks zurück (siehe Tabelle 2). Im Netzwerkbetrieb erhalten Sie mit den bisher besprochenen Aufrufen von »Fopen« und »Fcreate« einen exklusiven Zugriff auf die geöffnete Datei. Das bedeutet, daß ausschließlich Ihr Programm die Datei lesen und schreiben kann - ein Grund mehr, die Datei möglichst schnell wieder zu schließen, um den Netzbetrieb nicht unnötig aufzuhalten. Abhilfe schaffen die Netzwerkmodi von »Fopen«: Mit -1 öffnen Sie die Datei ohne Exklusivität zum Schreiben (etwa Fopen ("DATA",- 1);) und mit -2 zum Schreiben und Lesen.

Wollen Sie im Multitasking oder Netzwerkbetrieb Dateien und Dateibereiche verändern oder Stück für Stück auswerten, so sollten Sie diese zuvor sperren. Durch das Sperren (»Locking«) stellen Sie sicher, daß kein anderes Programm auf die Datei zugreift. Nach getaner Arbeit geben Sie die Datei oder den Dateibereich wieder frei (»Unlocking«).

Unter GEMDOS besitzen Sie jeweils drei Funktionen zum Sperren und Freigeben von Dateien und Dateibereichen. Die allgemeinste Funktion ist »Lock«( (GEMDOS 123). Sie sperrt eine ganze Datei. Dazu übergeben Sie als Parameter lediglich den Dateipfad. Als Ergebnis erhalten Sie den Wert null (kein Fehler) oder eine Fehlermeldung (negativer Wert) zurück. Eine mit lock() gesperrte Datei geben Sie mit »Unlock()« (GEMDOS 124) wieder frei. Als Parameter übergeben sie auch hier den Dateipfad. Die Anweisung Lock („WICHTIG.TXT“); verhindert, daß ein anderes Programm die angegebene Datei öffnet.

In einem großen Netzwerk ist das komplette Sperren einer wichtigen Datei äußerst uneffektiv. Aus diesem Grund stellt Ihnen GEMDOS die Funktion »Frlock« (»File record locking«, GEMDOS 98) zur Verfügung.

Mit dieser Funktion sperren Sie lediglich einen bestimmten Bereich innerhalb einer bereits geöffneten Datei. Als Parameter übergeben Sie die Dateikennung, den Offset, ab dem GEMDOS die Datei sperren soll, und die Anzahl der zu sperrenden Byte. Der Offset bezieht sich auf den Dateianfang; übergeben Sie jedoch das Langwort -1, so setzt GEMDOS selbständig den aktuellen Dateizeiger ein. Mit dem Aufruf Frlock(handle, (long) 1000, (long) 64) ; sperren Sie etwa ab dem 1000. Byte in der Datei einen Bereich von 64 Byte. »Frunlock()« (GEMDOS 99) hebt die Sperre wieder auf. Dazu übergeben Sie die Dateikennung und den Offset, den Sie bei »Flock« verwendet haben. Bezieht sich das Sperren auf die aktuelle Position in der Datei, so können Sie auch »Flock()« (GEMDOS 100) bzw. »Funlock()« (GEMDOS 101) verwenden. Hier entfällt die Angabe des Offsets. Die letzte Dateioperation heißt »Fflush()« (GEMDOS 102). Durch ihren Aufruf zwingen Sie GEMDOS, den Datenpuffer der angegebenen Datei zu leeren und die dort angesammelten Daten in die Datei zu schreiben. Als Parameter übergeben Sie die Dateikennung. (ah)

Kennung Name
1 Bionet
2 A-Net
3 Elan
4 TSE-Net
5 Atlanet
6 PAMs-Net
7 Transnet

Tabelle 2. Die Kennung (1..7) des vorhandenen Netzwerkes erfahren Sie über die »Nversion«-Funktion

Bezeichnung   Bedeutung
EINVFN -32 Falsche Funktionsnummer
EFILNF -33 Datei nicht gefunden
EPTHNF -34 Pfad nicht gefunden
ENHNDL -35 Keine freie Dateikennung mehr
EACCDN -36 Zugriff verweigert
EIHNDL -37 Falsches Handle
ENSMEM -39 Kein freier Speicher mehr
EIMBA -40 Ungültige Speicherblock-Adresse
EDRIVE -46 Ungültige Laufwerksangaben
ENMFIL -47 Keine weiteren Dateien (für Fsnext)
ERANGE -64 Bereichsfehler
EINTRN -65 Interner GEMOOS-Fehler
EPLFMT -66 Ungültiges Programmdatei-Format
EGSBF -67 Fehler beim Vergrößern eines Speicherblocks

Tabelle 3. Die GEMDOS-Fehlermeldungen im Überblick


Martin Backschat
Aus: TOS 09 / 1991, Seite 88

Links

Copyright-Bestimmungen: siehe Über diese Seite