Hallo WiPhi,
Ich bin auf genau das selbe Problem gestoßen. Allerdings ging es bei mir um viele kleine Dateien.
Wie du auch, vermutete ich das Problem im
des
.
Ich habe die Implementierung folgendermaßen angepasst:
Code:
function TDecryptStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
var
curPos: Int64;
newPos: Int64;
begin
curPos := FStream.Position;
newPos := CurPos;
case Origin of
soBeginning: newPos := Offset;
soCurrent: newPos := curPos + Offset;
soEnd: newPos := FStreamSize + Offset;
end;
if newPos < curPos then begin
// ResetStream;
// result := Skip(newPos);
FStream.Position := FStreamStartPos + newPos;
result := FStream.Position;
end
else begin
result := Skip(newPos - curPos);
end;
end;
Der Originalcode in
ist auskommentiert und durch die beiden neuen Zeilen im Block ersetzt.
Ich habe es auch mit einigen großen ca. 10MB und einer 290MB großen Datei getestet. Bei mir funktioniert der Aufruf von
Code:
aZipFile.Read(aZipFileIndex, aBytes)
mit dem Index der Datei und einem Byte Array.
Nebeneffekt ist, dass die Dekomprimierung nicht merklich langsamer wird, je mehr aus dem Zip File gelesen wird. Zumindest in dem umgeschriebenen Abschnitt wird der von Uwe Raabe erwähnte Brute Force Ansatz vermieden.
Vielleicht hilft es dir auch.
Vielen Dank auch an Uwe Raabe für die Quellen.
Gruß fux!!!