Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Platz lassen, in binärer Datei?

  Alt 28. Sep 2010, 08:05
Das wird relativ kompliziert. Um zu speichern ob da valide Daten drin sind, würde ich einfach ein entsprechendes Format wählen:

(Ohne Anspruch auf Vollständigkeit)

Code:
<1. Bit immer 0><31 bit Länge des Inhalts><1 bit valider Inhalt><2 bit ob Adresse folgt><5 bit zusätzliche Folgende Adresse><opt. 16/32/64 bit Folgende Adresse><Bis zu 2^31 Byte Inhalt>
Das kannst du dann beliebig hintereinander setzen. So kann eine Datei darin aber auch maximal 2^32 bit groß sein, oder man vergrößert die Folgeadresse.

Auch kann man überlegen ob die Folgeadresse relativ ist (also springe X. Byte weiter) oder absolut (springe an das X. Byte).

Beim Ende würde ich einfach erstmal ein Byte lesen und dann eventuell einen int64.

Beispielcode:
Delphi-Quellcode:
procedure WriteData(output : TStream; input : TStream);
var
  oldPos : Integer;
  size : Cardinal;
  parameters : Byte;
begin
  oldPos := output.Position;
  // find first free position
  output.read(size, SizeOf(size));
  // if there is enough space and marked as spacer
  if (size and $80 = 1) then
  begin
    // Enough space without follow adress.
    if (input.size + 5 < size and $7F) then
    // mit folgender Adresse wird es ein wenig schwieriger, da man nicht weiß, wie groß die sein muss
// if (input.size + 5 < size and $7F) || (input.size + 5 + (2 bis 8) < size and $7F) then
    begin
      // It goes here
      // Write Size etc.
    end;
  end;
  output.read(parameters, SizeOf(parameters));
  if parameters and $8 = 1 then // invalid block
  begin
    // Hier jetzt reinschreiben
  end;
  output.Position := oldPos.
end;
Das wird übrigens auch etwas komplizierter: Was ist zum Beispiel, wenn die Datei so groß ist, das weniger als 5 Byte noch reinpassen? Dann muss man ja irgendwie sagen, der Rest ist ungenutzt.

Eine Möglichkeit wäre: Das erste Bit auf 1 zu setzen: Dann liest er nur ein Byte aus in der die Anzahl der übersprungenen Byte steht. Bei mindestens als 5 Byte kann man einfach eine leere invalide Datei rein schreiben. Und bei 1 Byte bis 4 Byte platz schreibt man im ersten Bit eine 1 und in den anderen 7 Bit wie viele Bytes übersprungen werden sollen.

Aber ich hoffe das bringt dich schon mal näher ans Ziel. Eventuell sollte die Folgeadresse auch nicht optional sein. So spart man sich eventuell einiges an zusätzlichen Bedingungen und kann einfach ein Block schreiben und den nächsten suchen.

MfG
Fabian

PS: @Teekeks: Wenn man aber die erste Datei löscht wird die ganze Datei verschoben Und eventuell möchte man das verhindern.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat