Zitat von
MrKnogge:
xZise hast du dir
das hier schon mal angeschaut ?
Grüße
Christian
So ich habe es mir jetzt nochmal angeschaut, und naja es funktioniert nicht
Woran es genau liegt weiß ich nicht.
So sieht meine Testroutine aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
outdir :
string;
var
dictionary:integer;
inStream:TBufferedFS;
outStream:TBufferedFS;
filesize:int64;
i:integer;
properties:
array[0..4]
of byte;
decoder:TLZMADecoder;
outSize:int64;
v:byte;
const propertiessize=5;
begin
if (OpenDialog1.Execute)
and (SelectDirectory('
Ort zum Entpacken wählen', '
', outdir))
then
begin
if outdir[Length(outdir)] <> '
\'
then
outdir := outdir + '
\';
inStream:=TBufferedFS.Create(OpenDialog1.FileName,fmOpenRead
or fmsharedenynone);
outStream:=TBufferedFS.Create(outdir + '
bla', fmcreate);
if inStream.
read(properties, propertiesSize) <> propertiesSize
then
raise Exception.Create('
input .lzma file is too short');
decoder := TLZMADecoder.Create;
if not decoder.SetDecoderProperties(properties)
then
raise Exception.Create('
Incorrect stream properties');
outSize := 0;
for i := 0
to 7
do begin
v :=
{shortint}(ReadByte(inStream));
if v < 0
then
raise Exception.Create('
Can''
t read stream size');
outSize := outSize
or v
shl (8 * i);
end;
if not decoder.Code(inStream, outStream, outSize)
then
raise Exception.Create('
Error in data stream');
decoder.Free;
outStream.Free;
inStream.Free;
end;
end;
Erstmal ist komisch, warum der output eine Datei sein muss (ich entpacke DATEIEN oder einen ORDNER aber nicht immer EINE DATEI). Aber dann funktioniert "decoder.Code" nicht ganz. Als Input-Datei habe ich die Downloaddatei genommen.
Woran es genau liegt weiß ich nicht, da ich die Code-Routine einfach nicht verstehe (aufgrund der wunderbaren Dokumentation). Auf jeden Fall erreicht er folgende Bedingung (weshalb er abbricht) (ungefähr Z. 382):
Delphi-Quellcode:
if (rep0 >= nowPos64) or (rep0 >= m_DictionarySizeCheck) then begin
m_OutWindow.Flush();
result:=false;
exit;
end;
MfG
xZise