// vermuteter Aufbau der Indexdatei:
type
TIdxFile =
record
Filename:
array[0..19]
of Char;
OffSet: DWord;
end;
PIdxFile = ^TIdxFile;
TFileInfos =
array of TIdxFile;
// [..]
////////////////////////////////////////////////////////////////////////////////
//
// ExtractFile
//
// Extrahier eine Datei aus SrcFile nach DestFile
// Wirft Exceptions EReadError bzw. EWriteError beim Lesen bzw. Schreiben
//
procedure ExtractFile(SrcFile, DestFile:
string; Offset: Int64; FileSize:
Integer);
var
ms: TMemoryStream;
fs: TFileStream;
Buffer: PByteArray;
resourcestring
rsEReadError = '
Fehler beim Lesen der Datei %s';
rsEWriteError = '
Fehler beim Schreiben in die Datei %s';
begin
ms := TMemoryStream.Create;
fs := TFileStream.Create(DestFile, fmCreate);
try
// Datei laden und Dateizeiger positionieren
ms.LoadFromFile(SrcFile);
ms.Seek(OffSet, soFromBeginning);
// Speicher für Buffer anfordern
GetMem(Buffer, FileSize);
try
try
// Bytes aus SrcFile nach DestFile kopieren
ms.ReadBuffer(Buffer^, FileSize);
fs.WriteBuffer(Buffer^, FileSize);
except
on E: EReadError
do
raise E.Create(rsEReadError);
on E: EWriteError
do
raise E.Create(rsEWriteError);
end;
finally
FreeMem(Buffer, FileSize);
end;
finally
FreeAndNil(ms);
FreeAndNil(fs);
end;
end;
////////////////////////////////////////////////////////////////////////////////
//
// ReadIndexFile
//
// Indexdatei einlesen
// Wirft eine Exception EReadError bei Lesefehler
//
function ReadIndexFile(Filename:
string): TFileInfos;
var
fs: TFileStream;
i: Integer;
resourcestring
rsEReadError = '
Fehler beim einlesen der Datei %s';
begin
i := 0;
fs := TFileStream.Create(Filename, fmOpenRead);
try
// 2 Bytes nach vorne springen, da steht noch was, aber ich weiß nicht was,
// Eventuell eine Signatur oder so
fs.Seek(2, soFromBeginning);
// Größe des dynamisches Array setzten (Dateigröße / Recordgröße = Anzahl Datensätze)
SetLength(result, fs.Size
div sizeof(TIdxFile));
// so lange lesen bis wir am Ende sind
while fs.Position < fs.Size
do
begin
try
fs.ReadBuffer(result[i], sizeof(TIdxFile));
Inc(i);
except
on E: EReadError
do
raise E.Create(Format(rsEReadError, [Filename]));
end;
end;
finally
FreeAndNil(fs);
end;
end;