Hinweis: Dies ist die vollständige deutsche Übersetzung des Kapitels. Die Codebeispiele sind sprachunabhängig gültig.
Dieses Kapitel behandelt die Fähigkeiten von Harbour zur Dateiverarbeitung – vom Low-Level-Dateizugriff bis zur Datenbankverwaltung, einem Grundpfeiler der Sprache.
Harbour bietet – ähnlich wie C – eine Reihe von Funktionen für den direkten Dateizugriff auf Betriebssystemebene. Diese Funktionen ermöglichen vollständige Kontrolle über Lese- und Schreibvorgänge. Sie eignen sich ideal für Textdateien, Konfigurationsdateien, Binärdateien oder andere Formate, die .dbf nicht verwenden.
Die wichtigsten Funktionen sind:
FCREATE( <cFile>, [<nAttribute>] ) -> hFile: Erstellt eine neue Datei. Gibt ein „Handle“ zurück oder -1 bei Fehler.FOPEN( <cFile>, [<nMode>] ) -> hFile: Öffnet eine Datei (Modi: 0=lesen, 1=schreiben, 2=lesen & schreiben).FCLOSE( <hFile> ): Schließt eine Datei.Weitere Funktionen:
FREAD( <hFile>, @cBuffer, <nBytes> ) -> nBytesRead: Liest Bytes in einen Puffer.FWRITE( <hFile>, <cBuffer>, [<nBytes>] ) -> nBytesWritten: Schreibt Pufferinhalt in Datei.FSEEK( <hFile>, <nOffset>, [<nOrigin>] ): Positioniert den Datei-Zeiger neu.
// Beispiel: Schreiben und Lesen im Low-Level
#include "fileio.ch"
PROCEDURE Main()
LOCAL hFile, cTexto
// Datei erstellen und schreiben
hFile := FCREATE( "test.txt" )
IF hFile != -1
FWRITE( hFile, "Hallo, Harbour!" )
FCLOSE( hFile )
? "Datei 'test.txt' wurde erstellt."
ELSE
? "Fehler beim Erstellen der Datei."
ENDIF
// Datei öffnen und lesen
hFile := FOPEN( "test.txt", FO_READ ) // FO_READ = 0
IF hFile != -1
cTexto := Space( 1024 )
FREAD( hFile, @cTexto, 1024 )
FCLOSE( hFile )
? "Inhalt:", Trim(cTexto)
ELSE
? "Fehler beim Öffnen der Datei."
ENDIF
RETURN
Das Herzstück der Datenverwaltung in Harbour ist das Format .dbf, übernommen von dBase – ein Standardformat zur Speicherung tabellarischer Daten.
Ein .dbf-Datei besteht aus zwei Hauptteilen:
Diese Struktur ermöglicht einen schnellen Zugriff durch Harbour.
Harbour stellt eine einfach zu benutzende Sprache zur Bearbeitung von .dbf-Dateien bereit.
USE <cFile>: Öffnet eine Tabelle im Arbeitsbereich.APPEND BLANK: Fügt einen leeren Datensatz am Ende hinzu.REPLACE <Feld> WITH <Wert>: Ändert den aktuellen Datensatz.
// Beispiel: Datensatz hinzufügen
PROCEDURE Main()
IF !File("kunden.dbf")
dbCreate( "kunden.dbf", { ;
{ "NAME", "C", 25, 0 }, ;
{ "STADT", "C", 20, 0 }, ;
{ "ALTER", "N", 3, 0 } ;
} )
ENDIF
USE "kunden.dbf"
APPEND BLANK
REPLACE NAME WITH "Max Mustermann"
REPLACE STADT WITH "Berlin"
REPLACE ALTER WITH 42
COMMIT
CLOSE DATABASES
? "Datensatz hinzugefügt."
RETURN
Bei großen Tabellen ist sequentielles Suchen langsam (LOCATE). Dafür verwendet man **Indizes**.
Ein Index (.ntx) ist eine sortierte Kopie eines oder mehrerer Felder. Suchen über Indizes sind deutlich schneller, da direkt zur Position im .dbf gesprungen wird.
INDEX ON <Ausdruck> TO <Dateiname>: Erstellt einen Index.SET INDEX TO <Dateiname>: Verknüpft Index mit Tabelle.SEEK <Wert>: Schnellsuche im Index.
// Beispiel: Index-Nutzung
USE "kunden.dbf"
IF !File("kunden.ntx")
INDEX ON NAME TO "kunden"
ENDIF
SET INDEX TO "kunden"
SEEK "Max Mustermann"
IF Found()
? "Gefunden:", NAME, STADT
ELSE
? "Kunde nicht gefunden."
ENDIF
CLOSE DATABASES
Eine der stärksten Funktionen von Harbour ist das Konzept der **austauschbaren Datenbanktreiber** (RDD = Replaceable Database Drivers).
Dank RDDs bleibt der Code für USE, SEEK, REPLACE etc. gleich – egal ob du .dbf, SQLite oder MySQL nutzt. Harbour abstrahiert das Datenbanksystem.
// Beispiel: FoxPro-kompatibler Treiber
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
USE "lieferanten.dbf"
...
Harbour unterstützt nativ DBFNTX, DBFCDX, DBFNSX sowie externe RDDs für moderne Systeme wie **PostgreSQL, MySQL, SQLite, Oracle** – perfekt für Client/Server-Architekturen.