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.