9. Arbeit mit Dateien
9.2 Dateiattribute - DOS-Attribute: FileGetAttrs(), FileSetAttrs, FileGetTime(), FileSetTime, FileSize(), GEOS-Attribute, ... 9.3 Anlegen, Öffnen und Schließen von Dateien - FileCreate, FileOpen, FileClose, NullFile() 9.4 Lesen und Schreiben von Binärdateien - FileRead(), FileWrite(), FileInsert 9.5 Lesen und Schreiben von Textdateien - FileReadLine$(), FileWriteLine, FileInsertLine, FileReplaceLine 9.6 Sonstige Funktionen - FileGetPos(), FileSetPos, FileResize, FileTruncate, FileCommit ^9.1 Überblick zur DateiarbeitFür R-BASIC ist jede Datei zunächst eine einfache Abfolge von Bytes. Um auf die Daten in einer Datei zugreifen zu können, müssen Sie sie zuerst "öffnen" und nach Gebrauch wieder "schließen". Während die Datei geöffnet ist, erfolgt der Zugriff auf eine Datei über eine Variablen vom Typ FILE, die von FileOpen bzw. FileCreate geliefert wird. GEOS verwaltet außerdem einen "Dateizeiger", der die Position bestimmt, an der Daten gelesen oder geschrieben werden.R-BASIC verfügt dabei über einige Möglichkeiten, die den meisten Programmiersprachen fehlen, wie z.B. das direkte Einfügen von Daten, ohne die darauf folgenden Daten zu überschreiben. Hier finden Sie eine Übersicht über die Befehle zum Lesen aus und Schreiben von Daten in Dateien, die in diesem Kapitel behandelt werden.
DOS-Attribute
GEOS-AttributeZusätzlich zu den DOS-Attributen haben GEOS-Dateien weitere Attribute. R-BASIC unterstützt die folgenden Attribute:
FileRead, FileWrite und FileInsert sind Universalroutinen. Sie arbeiten mit allen Dateien und allen Typen von Variablen, einschließlich Strings und Strukturen zusammen. Für die Arbeit mit Textdateien (lesen und schreiben von Textzeilen) gibt es zusätzlich dazu spezialisierte Routinen (Abschnitt 9.5).
Diese Routinen sind auf Textzeilen, die durch ein Zeilenendezeichen abgeschlossen sind, spezialisiert. Das trifft für normale Textdateien zu. Zeilenendezeichen sind die ASCII-Codes 13 (Wagenrücklauf, Carriage return, CR) bzw. 10 (Zeilenvorschub, LineFeed, LF) oder eine Kombination davon, üblicherweise die Folge 13, 10 (CRLF).
^9.2 DateiattributeNeben dem Namen besitzt jede Datei eine eine Reihe von zusätzlichen Eigenschaften, die sogenannten "Attribute". Es gibt zwei Gruppen von Attributen, die "Standard-Attribute", einschließlich Dateigröße und dem Datum der letzten Änderung, die bereits aus alten DOS-Tagen stammen, und die "GEOS-Attribute", die nur für GEOS-Dateien vorhanden sind.
Die meisten der in diesem Kapitel besprochenen Funktionen können sowohl mit offenen Dateien (referenziert über eine FILE-Variable) als auch mit geschlossenen Dateien (referenziert über ihren Namen) umgehen.
Die Standard-AttributeDie Standardattribute existieren für JEDE Datei und sind als einzelne Bits in einem Byte definiert. Sie können mit FileGetAttrs gelesen und mit FileSetAttrs gesetzt werden. Es sind die folgenden Attribute definiert, die Zahlen in der ersten Spalte sind die Bit-Nummer und der dazugehörige Wert.
FileGetAttrsLiefert die DOS-Standardattribute einer Datei. Die Attribute sind einzelne Bits und können mit AND bzw. OR - Verknüpfungen abgefragt werden.Syntax: <numVar> = FileGetAttrs (fileName$) Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiel: |
DIM attrs AS word
attrs = FileGetAttrs ("info.txt")
IF attrs AND FA_READ_ONLY THEN Print "schreibgeschützt"
|
FileSetAttrsSetzt die DOS-Standardattribute einer Datei. Die Attribute sind einzelne Bits und können mit AND bzw. OR verknüpft werden.Syntax: FileSetAttrs fileName$ , attrs Die Systemvariable fileError wird gesetzt oder gelöscht. FileSetAttrs kann nicht mit einer offenen Datei verwendet werden. Beispiele: |
! Setzen von FA_SYSTEM, löschen aller anderen Attribute FileSetAttrs "liste.txt" , FA_SYSTEM ! Setzen von FA_SYSTEM unter Beibehaltung der anderen Attribute DIM attrs attrs = FileGetAttrs ( "liste.txt" ) FileSetAttrs "liste.txt" , attrs OR FA_SYSTEM |
FileGetTimeLiefert das Datum und die Uhrzeit der letzten Änderung einer Datei. Das Betriebssystem setzt diesen Wert jedes Mal, wenn der Dateiinhalt geändert wird.Syntax: <time> = FileGetTime ( fileName$ ) Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiel: |
DIM time AS DateAndTime time = FileGetTime "info.txt" Print "Geändert am: "; FormatDate$(time); Print "um: "; FormatTime$(time) |
FileSetTimeVerändert das Datum und die Uhrzeit der letzen Änderung einer Datei.Achtung! Sie überschreiben hiermit den Wert, den das Betriebssystem automatisch vergibt. Wird die Datei anschließend nochmals geändert, überschreibt das Betriebssystem den Wert erneut. Syntax: FileSetTime fileName$ , <time> Fehlerbedingung: Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiel: |
DIM time AS DateAndTime
time = FileGetTime ("info.txt")
time.year = 2001
FileSetTime "info.txt", time
|
FileSizeLiefert die aktuelle Größe der Datei in Bytes. Der zurückgegebene Wert liegt im Bereich von 0 bis 4294967295, da Dateien maximal 4 GByte groß werden können.Syntax: <numVar> = FileSize (fileName$) Die Systemvariable fileError wird gesetzt oder gelöscht. GEOS-AttributeZusätzlich zu den Standardattributen haben GEOS-Dateien weitere Attribute. R-BASIC unterstützt die wichtigen Attribute: Token (Anzeige-Icon), Creator (Icon des zugehörigen Programms), CreationTime (Datum der Dateierstellung), UserNotes (Benutzernotizen), Release (Versionsnummer) und Protocol. Diese werden im Dateikopf, den ersten 256 Byte der Datei gespeichert. Bei Verzeichnissen befinden sich diese Attribute in der @dirname.000 - Datei.CreationTime wird ein einer DateAndTime Struktur gespeichert. |
STRUCT DateAndTime year AS WORD ' Jahr (z.B. 2014) month AS WORD ' Monat (1...12) day AS WORD ' Tag (1 ... 31) hour AS WORD ' Stunde (0 ... 23) minute AS WORD ' Minute (0 ... 59) second AS WORD ' Sekunde (0 ... 59) END STRUCT |
|
UserNotes ist ein String mit bis zu 99 Zeichen.
Token und Creator werden in einer Struktur gespeichert, die GeodeToken heißt und folgendermaßen definiert ist. Das Bild dazu befindet sich in der TokenDB-Datei. |
STRUCT GeodeToken manufid AS WORD ' Manufacturer ID (Hersteller-Identifikation) tokenChars AS STRING(4) END STRUCT |
|
Eine fehlerhafte Belegung der Werte für Token oder Creator kann die Arbeit mit der Datei unmöglich machen. Setzen Sie in diesem Fall einfach wieder den korrekten Wert.
Release und Protocol werden in einer Struktur gespeichert die ReleaseNumber heißt und folgendermaßen definiert ist. R-BASIC verwendet die ersten beiden Felder dieser Struktur auch für die Protokollnummer. |
STRUCT ReleaseNumber ' Bedeutung der Felder: rnMajor as WORD ' große, meist inkompatible Neuerungen rnMinor as WORD ' kleinere, kompatible Neuerungen rnChange AS WORD ' interne Änderungen rnEngineering as WORD ' kleine interne Änderungen End STRUCT |
|
Tritt ein Fehler auf, z.B. weil die Datei nicht gefunden wird oder weil das Attribut nicht unterstützt wird, (weil es eine DOS-Datei ist), wird die Systemvariable fileError gesetzt. Im Erfolgsfall wird die fileError-Variable zurückgesetzt (d.h. mit Null belegt)
Die Bedeutung der Parameter der folgenden Übersicht und Beispiele sind weiter unten zu finden.
FileGetToken, FileSetTokenLiest bzw. setzt das "Token" der Datei.Syntax: <token> = FileGetToken (ffileName$) ' Auslesen des Token FileGetCreator, FileSetCreatorLiest (FileGetCreator) oder setzt (FileSetCreator) das Creator-Token.Syntax: <token> = FileGetCreator (fileName$) ' Auslesen des Creator-Token FileGetCreationTime, FileSetCreationTimeLiest oder verändert das Datum, an dem die Datei angelegt wurde.Syntax: <time> = FileGetCreationTime (fileName$) ' Auslesen der Erstellungszeit FileGetUsernotes, FileSetUsernotesLiest oder verändert die Benutzernotizen der Datei.Syntax: notes$ = FileGetUsernotes (fileName$) ' Auslesen der Benutzernotizen FileGetRelease, FileSetReleaseLiest oder verändert die Releasenummer der Datei. Das GEOS System verwendet die Releasenummer zum Versionscheck und zu Informationszwecken. R-BASIC und der Uni-Installer verwenden die Releasenummer um zu entscheiden ob eine Datei neuer ist als eine andere Datei mit gleichem Namen. Der R-BASIC Compiler setzt die ersten drei Felder der Releasenummer von Launcher und BIN-Datei entsprechend der Versionsnummer des Programms bzw. der Library (siehe Befehl Version$).Bei R-BASIC Libraries wird die Releasenummer (und damit die Versionsnummer der Library) verwendet um zu entscheiden, ob ein BASIC Programm mit dieser Library zusammenarbeiten kann. Um zu entscheiden, ob die R-BASIC IDE die Datei öffnen und bearbeiten kann, wird die Protokollnummer, nicht die Releasenummer, benutzt. Syntax: <release> = FileGetRelease (fileName$) FileGetProtocol, FileSetProtocolLiest oder verändert dieProtokollnummer der Datei. Das GEOS System verwendet die Protocollnummer um zu prüfen, ob Programme, Dateien und Libraries kompatibel zueinander sind. R-BASIC definiert keine eigene Struktur für die Protokollnummer sondern verwendet die Felder rnMajor und rnMinor der ReleaseNumber Struktur.Vorsicht! Änderungen der Protokollnummer können dazu führen, dass Programme nicht mehr funktionieren oder Dateien nicht mehr gelesen werden können. Syntax: <protocol> = FileGetProtocol (fileName$) Angaben zu den Parametern und Rückgabewerten: Beispiel: |
DIM token AS GeodeToken DIM time AS DateAndTime DIM release AS ReleaseNumber DIM text$ SetStandardPath SP_SYSTEM token = FileGetToken "geos.geo" Print "Token: \"";token.tokenchars;"\","; token.manufid ' manufid = Manufacturer ID token = FileGetCreator "geos.geo" Print "Creator: \"";token.tokenchars;"\","; token.manufid time = FileGetCreationTime "geos.geo" Print "Datum: "; FormatDate$(time) Print "Zeit: "; FormatTime$(time) release = FileGetRelease "geos.geo" text$ = "Version: "+ Trim$(Str$(release.rnMajor)) text$ = text$ + "."+ Trim$(Str$(release.rnMinor)) text$ = text$ + " "+ Trim$(Str$(release.rnChange)) text$ = text$ + "-"+ Trim$(Str$(release.rnEngineering)) Print text$ release = FileGetProtocol "geos.geo" text$ = "Protocol: "+ Trim$(Str$(release.rnMajor)) text$ = text$ + "."+ Trim$(Str$(release.rnMinor)) Print text$ |
^ |