Ich wollte ein Datei Container schreiben... Gesagt getan... Allerdings hackt es schon beim Header xD
Und zwar wollte ich folgenden Header haben:
Delphi-Quellcode:
TXFCHeader = packed record
XFCSignature : string[3]; // XCF
UserSignature : string[5];
Version : Word;
FileCount : Word;
Sizes : array of Cardinal;
end;
Dann speichere ich das folgendermaßen:
Delphi-Quellcode:
procedure TXFCMain.SaveContainer(const AFileName: string);
var
container : TFileStream;
b : string;
i : Word;
begin
FFileName := AFileName;
container := TFileStream.Create(AFileName, fmCreate);
try
// Write Header
b := FHeader.XFCSignature + FHeader.UserSignature;
container.Write(Pointer(b)^, 8);
container.Write(FHeader.Version, SizeOf(FHeader.Version));
container.Write(FHeader.FileCount, SizeOf(FHeader.FileCount));
i := 0;
while i < FHeader.FileCount do
begin
container.Write(FHeader.Sizes[i], SizeOf(FHeader.Sizes[i]));
inc(i);
end;
// Header written
finally
container.Free;
end;
end;
Und lade es folgendermaßen:
Delphi-Quellcode:
procedure TXFCMain.LoadContainer(const AFileName: string);
var
container : TFileStream;
b : string;
i : Integer;
begin
if FileExists(AFileName) then
begin
container := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
try
// Read Header
b := '';
container.Read(Pointer(b)^, 3);
if (b <> 'XFC') and (not FDisableNoContainerException) then // Wrong Signature
raise ENoContainerException.CreateFmt(NO_XFC_SIGNATURE, [AFileName, b]);
container.Read(Pointer(b)^, 5);
FHeader.UserSignature := b;
container.Read(FHeader.Version, SizeOf(FHeader.Version));
container.Read(FHeader.FileCount, SizeOf(FHeader.FileCount));
i := 0;
while i < FHeader.FileCount do
begin
container.Read(FHeader.Sizes[i], SizeOf(FHeader.Sizes[i]));
inc(i);
end;
// Header read;
finally
container.Free;
end;
end else
begin
raise ENoContainerException.CreateFmt(DOES_NOT_EXISTS, [AFileName]);
end;
end;
Problem ist, dass "b" beim laden nicht XFC sondern nichts enthält. Jedenfalls zeigt die Fehlermeldung nichts an...
Aber ich weis nicht, was da schief gelaufen sein könnte...