OSZ Handel I
Informatik

Dateiorganisation
Dateikonzepte in Delphi

H. Härtl

[Home | Gymn. Oberstufe | Informatik | Unterrichtsmaterialien | Delphi]

Was eine Datei ist, hängt – wie so oft – vom Blickwinkel des Betrachters ab.

Aus der Sicht des Anwenders / Benutzers ist eine Datei eine mehr oder weniger wichtige Datensammlung, in der z.B. alle Informationen über den momentan vorhandenen Warenbestand enthalten sind. Aus dieser Sicht sind in Dateien Artikelnummern, Bestellmengen und Preise gespeichert, die zur Erledigung der jeweiligen Aufgaben möglichst bequem, schnell und in der richtigen Auswahl zur Verfügung stehen sollten.

Aus der Sicht des Betriebssystems sind – salopp betrachtet – Dateien ziemlich eintönige Folgen von Bytes, die auf der Hardware einen bestimmten Platz belegen. Es genügt, wenn man die vielen Bytes, die zu einer Datei gehören auf den nächsten freien Platz schüttet und sich merkt wo die Datei anfängt, und falls der Inhalt an mehreren Stellen verteilt gespeichert werden musste, in welcher Reihenfolge die Teile zusammengehören.

Viel wichtiger ist es da schon, den Dateiinhalt so zu speichern, dass man die Datei schnell wieder bereitstellen kann, und wenn vor allem penibel darauf geachtet wird, dass nur berechtigte Benutzer auf die einzelnen Dateien zugreifen können und dabei bloß nie die Inhalte unterschiedlicher Dateien durcheinander geraten oder gar verloren gehen.

Dass Byte 400 bis 412 besonders wichtig sind, da dort mein Kontostand gespeichert ist, ist dem Betriebssystem völlig schnuppe. Aus seiner Sicht sind alle Dateien lediglich Folgen von Bytes, die möglichst rasch von A nach B zu transportieren sind, ohne dass ein Bit verloren geht.

Der Programmierer steht genau zwischen beiden Extremen. Er steht vor dem Problem, die Wünsche des Anwenders, der mit Texten, Mengen, Preisen und Datensätzen arbeitet, auf den beschränkten Möglichkeiten des jeweiligen Betriebssystems abzubilden, das grundsätzlich nur eine mehr oder weniger große Anzahl von Bytes über einen bestimmten Dateinamen zur Verfügung stellt.

 

 

Und nun zum Speziellen:

Delphi bietet wie viele andere Programmiersprachen dem Entwickler unterschiedliche Möglichkeiten zur Bearbeitung von Dateien an, denen jeweils ganz bestimmte Konzepte zu Grunde liegen.

 

Textfile

File of Records
(typisierte Dateien)

File-Stream

untypisierte Dateien

Beispiel:

Den 1. Datensatz aus der Datei lesen. Falls dies der Datensatz des Mitarbeiter „Härtl" ist, das Gehalt auf 10000 ändern.

!!! Abweichendes Beispiel !!!

!!! Kopieren einer Datei !!!

procedure DemoTextdatei;

var Datei : TextFile;
Name : string;
Gehalt: single;

begin
AssignFile
(Datei, ‚’Bspl.txt’);
Reset
(Datei);
Readln(Datei, Name, Gehalt);
  //Erste Zeile aus Datei lesen.
....
  // Noch den ganzen Rest lesen
  // Codierung fehlt hier
Rewrite(Datei); 
  // Inhalt überschrb.
if Name := ′Härtl′
then Gehalt := 10000.0;
Writeln(Datei, Name, Gehalt);
   // Noch den ganzen Rest schreiben
  // Codierung fehlt hier
...
CloseFile(Datei);
end;

procedure DemoFileOfRecords;
Type
Mitarbeiter = record
Name : string[15];
Gehalt : single;
end;
var Datei : File of Mitarbeiter;
Datensatz : Mitarbeiter


begin
AssignFile
(Datei, ‚’Bspl.dat’);
Reset(Datei);
Read(Datei, Datensatz);
  //Erste Zeile aus Datei lesen.
DatSatz.Name := ′Härtl′;
if
Datensatz.Name = ′Härtl′
then Datensatz.Gehalt := 10000.0;
Seek(Datei, 0);
   // zum Dateianfang
Write(Datei, Datensatz);
CloseFile(Datei);
end;

procedure DemoFileStream;
var Datei TFileStream;
Name : string[15];
Gehalt:: single;

begin
Datei :=
FileStream.Create(′Bspl.dat′,
fmOpenReadWrite);
With Datei do
begin
Read
(Name, SizeOf(Name));
Read(Gehalt, SizeOf(Gehalt));
if Name := ′Härtl
then begin
Gehalt := 10000.0;
Position(0); 
  // zum Dateianf.
Write(Name := SizeOf(Name));
Write(Gehalt, SizeOf(Gehalt));
Free;
end; // with Datei
end;

procedure DemoFileOfStrukturlos;
var Datei1, Datei2 : File;
Buf : array[1..1024] of char;
NumRead : integer;
NumWritten : integer;

begin
AssignFile
(Datei1, ’Ori.dat’);
AssignFile(Datei2, ’Kopie.dat’);
Reset(Datei1);
Rewrite(Datei2);
repeat
BlockRead
(Datei1, Buf,
SizeOf(Buf), NumRead);
BlockWrite(Datei1, Buf,
NumRead, NumWritten);
until (NumRead = 0) or
(NumWritten <> NumRead);
closeFile(Datei);
CloseFile(Datei2);
end;

Textfile

File of Records
(typisierte Dateien)

File-Stream

untypisierte Dateien

Eine Textdatei ist eine Ansammlung von Zeichen, die in Zeilen angeordnet sind.

Die zu verwaltenden Daten werden jeweils als einzelne Textzeilen gespeichert, die durch Zeilenendemarken getrennt sind, i.d.R. CRT oder CRT + LF.

 

Eine solche Datei besteht aus einzelnen Datensätzen. Alle Datensätze in der Datei haben die gleiche Struktur woraus folgt, dass jeder Datensatz gleich lang ist,

z.B. Artikelsatz(ArtNr, Name, Bestand).

 

Datei-Streams sind eine Spezialisierung der allgemeinen Stream-Klasse und das objektorientierte Pendant zur Dateiverarbeitung und werden in Delphi über die Klasse TFileStream zur Verfügung gestellt.

Die Verarbeitung von Dateien kann hier über ein einfaches, elementares Konzept mit lediglich 3 Methoden und 2 Attributen bewerkstelligt werden.

Elementare „low level Dateiverarbeitung"

Eine Datei wird dabei als strukturlose aufeinanderfolge von Bytes betrachtet.

 

Vorteil:

Einfach zu programmieren.

Die Datensätze dürfen unterschiedlich lang sein.

Nachteil:

Ältere Implementierungen beschränken die maximale Zeilenlänge auf 255 Byte.

Konzept eignet sich nicht zur Abbildung komplexer Datenstrukturen.

Nur sequentielle Dateiverarbeitung. (Keine wahlfreie Zugriffsreihenfolge – Random Access - auf die einzelnen Datensätze möglich.)

Änderungen innerhalb einer bestehenden Datei verlangen grundsätzlich, dass die gesamte Datei „neu geschrieben wird".

Eignung:

Für Datenbestände mit geringer Struktur, deren Überarbeitung nicht zeitkritisch ist.

(EMail, Quellprogramme)

Standardmethoden:

(Siehe auch Delphi-Hilfesystem)

Datei öffnen / schließen

Lesen und Schreiben ganzer Zeilen.

Abfrage auf Zeilenende (EndOfLine) und Dateiende (EndOfFile)

Kein freies Positionieren (Seek) der Dateimarke innerhalb der Datei möglich.

Vorteil:

Komplexe Datenstrukturen können direkt auf Dateien abgebildet werden, z.B. Artikeldatei als File of TKundensatz.

Änderung einzelner Datensätze innerhalb der Datei möglich.

Wahlfreier Zugriff (Random Access) möglich.

Nachteil:

Für unterschiedliche Datenstrukturen müssen unterschiedliche Dateien verwaltet werden.

Eine spätere Veränderung der Datenstruktur verlangt eine „Reorganisation" der gesamten Datei.

Erzwingt bei praktischen Anwendungen, dass im Datenbestand unnötige „Leerbytes" gespeichert werden müssen. Ist z.B. das Attribut Name als string[20] vereinbart, belegen auch kurze Namen denselben Speicherplatz. Längere Namen müssen auf 20 Zeichen abgeschnitten werden.

Eignung:

Standarddateityp zur Verwaltung von Datenbeständen mit festem Format und wahlfreiem Zugriff, wie z.B. Kundendatensätzen, Artikeldatensätzen. (Zugriff kann über spezielle Indexdateien zusätzlich beschleunigt werden.)

Standardmethoden:

(Siehe auch Delphi-Hilfesystem)

Freies Positionieren (Seek) innerhalb der Datei möglich.

Vorteil:

Objektorientiertes „Allround-Konzept".

Leicht portierbar.

Streams sind nicht an eine bestimmte Hardware gebunden. Das gleiche Grundkonzept kann ebenso zur Datenspeicherung auf verschiedenen Medien, wie auch zur Kommunikation mit anderen Prozessen benutzt werden.

Nachteil: (kaum signifikant)

Bietet dem Programmierer – vergleichbar untypisierten Dateien – lediglich eine amorphe Struktur auf der komplexe Datenstrukturen nicht unmittelbar unterstützt werden. (… aber leicht abgebildet werden können.)

Eignung:

Standardschnittstelle zur persistenten Datenhaltung für objektorientierte Systeme.

Attribute:

(Handle,) Size, Position

Standardmethoden:

(Siehe auch Delphi-Hilfesystem)

Create, Free (nicht Destroy verwenden)

Read, Write, Seek

Freies Positionieren (Seek) innerhalb der Datei möglich.

EndOfFile kann über den Vergleich (Position = Size) bestimmt werden

Vorteil:

Elementares Konzept, das leicht portierbar und über das Blockkonzept hohe Übertragungsgeschwindigkeiten erreichen kann.

Nachteil:

Bietet dem Programmierer lediglich eine amorphe Struktur, auf der sich komplexe Datenstrukturen nur indirekt abbilden lassen.

Standardmethoden:

Wie „file of records".

Lesen und Schreiben über

„BlockRead" und „BlockWrite"


29. März 2007    Siegfried Spolwig

page_top