Home » Tutorials » Datenspeicherung » Binäre Dateien

Binäre Dateien

DateiLaden

Die eigentliche Arbeit fällt in der Methode DateiLaden an.

procedure TFrmMain.DateiLaden;
var
  ...
  Version: string;
  v1, v2: integer;
begin
  ...
        if (StreamData.LoadFromFile(OdgKontakte.FileName) <> blrOK)
          or (StreamData.ApplicationName <> 'RakBinaryStreamData Tutorial') then
        begin
          ShowMessage('Unbekanntes Datei-Format');
        end
        else
        begin
          Version := StreamData.AttributeAsString('OpenVersion', '');
          DoIt := Version ='';
          if not DoIt then
          begin
            DoIt := ListLen(Version, '.') = 3;
            if DoIt then
            begin
              v1 := StrToIntDef(ListGetAt(Version, 0, '.'), -1);
              v2 := StrToIntDef(ListGetAt(Version, 1, '.'), -1);
              DoIt := (v1 > -1) and (v2 > -1);
              if DoIt then
              begin
                DoIt := v1 < FULL_VERSION_NUMBER;
                if not DoIt then
                  DoIt := (v1 = FULL_VERSION_NUMBER) and (v2 <= PART_VERSION_NUMBER);
              end;
            end;
          end;

          if DoIt then
          begin
            Tag := StreamData.FindFirstTag('Kontakte');
            if Tag <> nil then
              FKontakte.LoadFromBinaryTag(Tag);

            Datei := OdgKontakte.FileName;
            HasChanged := false;
          end
          else
          begin
            ShowMessage('Die Datei wurde von der Version '
              + StreamData.ApplicationVersion + ' des Kontaktmanagers erzeugt.'
              + #13'Deshalb kann die Datei nicht gelesen werden.');
          end;
        end;
  ...
end;

An der Methode DateiLaden müssen wir schon deutlich mehr anpassen als an der Methode SpeichernAls.

Version := StreamData.AttributeAsString('OpenVersion', '');

Wir müssen natürlich das neue Attribut auswerten. Bei Dateien der ersten Version gibt es das Attribut nicht, also wird dann der Defaultwert Leerstring zurückgegeben.
Dann kommt der Code, mit dem festgestellt wird, ob unser Programm eine Version hat, die mit dieser Datei wirklich was anfangen kann.

DoIt := Version ='';

Wenn es das Attribut nicht gab, dann wird davon ausgegangen, dass wir mit den Daten etwas anfangen können.

if not DoIt then

Wenn es das Attribut gab, dann müssen wir den Wert noch näher betrachten.

DoIt := ListLen(Version, '.') = 2;
            if DoIt then
            begin

Wir überprüfen hier einfach, ob die Version grob das erwartete Format hat, nämlich, dass es aus zwei durch einen Punkt getrennten Werten besteht. Die Funktion ListLen findet man in der Unit miscfunc, genauso, wie die folgende Funktion ListGetAt.

 v1 := StrToIntDef(ListGetAt(Version, 0, '.'), -1);
              v2 := StrToIntDef(ListGetAt(Version, 1, '.'), -1);

Hier wandeln wir die Stringwerte in Zahlen um.

DoIt := (v1 > -1) and (v2 > -1);

Hier prüfen wir, ob die ersten beiden Teile wirklich Zahlen waren.

DoIt := v1 < FULL_VERSION_NUMBER;

Wenn bereits unsere Hauptversionsnummer größer als die geforderte ist, dann können wir zuschlagen.

DoIt := (v1 = FULL_VERSION_NUMBER) and (v2 <= PART_VERSION_NUMBER);

Wenn unsere Hauptversionsnummer gleich der geforderten ist und die Teilversionsnummer größer oder gleich der geforderten ist, dann dürfen wir die Daten auslesen.

ShowMessage('Die Datei wurde von der Version '
              + StreamData.ApplicationVersion + ' des Kontaktmanagers erzeugt.'
              + #13'Deshalb kann die Datei nicht gelesen werden.');

Wenn die Daten in einem Format vorliegen, aus dem wir beim besten Willen nichts Vernünftiges mehr herausbekommen, dann geben wir eine entsprechende Meldung aus. Natürlich könnten wir hier auch die Versionsnummer ausgeben, ab der die Datei ausgelesen werden kann. Wir können uns aber nur bei der Originalversion sicher sein, dass sie wirklich mit allen Daten etwas anfangen kann. Deswegen preisen wir diese an.