我在this找到delphi-zip庫的線程鏈接,該鏈接庫實現了LZMA。但我無法正確使用它的解壓縮。 有人可以使用這個庫爲我寫一個解壓縮示例嗎?德爾福LZMA解壓縮樣本
這裏是我的代碼,它適用於壓縮,但對於解壓沒有工作,返回0,大小
使用System.Zip.LZMA;
....
procedure TForm2.CompressProgress(Sender: TObject; const aPosition, aSize, aCompressedSize: UInt64);
begin
end;
procedure TForm2.DecompressProgress(Sender: TObject; const aPosition, aSize: UInt64);
begin
end;
procedure TForm2.CompressButton1Click(Sender: TObject);
var LZI: TLZMAEncoderStream; OutStream, InStream: TMemoryStream;
begin
OutStream:= TMemoryStream.Create;
LZI := TLZMAEncoderStream.Create(OutStream, CompressProgress);
InStream:= TMemoryStream.Create;
InStream.LoadFromFile('1.exe');
InStream.Position := 0;
LZI.Write(InStream, InStream.Size);
OutStream.Position := 0;
OutStream.SaveToFile('1.exe.lzma');
InStream.Free;
OutStream.Free;
LZI.Free;
end;
procedure TForm2.DecompressButton2Click(Sender: TObject);
var Deca: TLZMADecoderStream; Str1: TMemoryStream; S2 : TBytesStream; J, I: Cardinal;
begin
I := 0;
Str1 := TMemoryStream.Create;
Str1.LoadFromFile('1.exe.lzma');
Str1.Position := 0;
Deca:= TLZMADecoderStream.Create(Str1, DecompressProgress);
S2 := TBytesStream.Create;
J := Deca.Read(S2.Bytes, 0, i);
Caption := IntToStr(J);
S2.Position := 0;
S2.SaveToFile('1.exe');
Deca.Free;
Str1.Free;
S2.Free;
end;
也是我試圖做這樣的,但還是不行
procedure TForm2.Button2Click(Sender: TObject);
var Deca: TLZMADecoderStream; Str1 : TMemoryStream; S2:TBytesStream; J, I: Cardinal;
begin
I := 0;
Str1 := TMemoryStream.Create;
Str1.LoadFromFile('1.exe.lzma');
Str1.Position := 0;
Deca:= TLZMADecoderStream.Create(Str1, DeProgress);
S2 := TBytesStream.Create;
Deca.Position := 0;
J := Deca.Read(S2.Bytes, 0, Deca.Size);
Caption := IntToStr(J);
S2.Position := 0;
S2.SaveToFile('Dec0.exe');
Deca.Free;
Str1.Free;
S2.Free;
end;
您從解壓流中讀取0個字節,您預期會發生什麼? –
'J:= Deca.Read(S2.Bytes,0,i);'。你初始化了'I:= 0;',從不改變它,因此從流中讀取零字節。你得到了你所要求的,AFAICT。 –
所以我想你需要運行一個循環讀取塊,直到讀取返回0爲止。你也做了很多Delphi程序員所做的事情,並且不惜代價地使用內存流。你正在閱讀一個文件?使用TFileStream。不要先把它全部讀入內存。解壓時爲什麼要讀入字節流,然後保存到文件。直接讀入以寫入模式打開的文件流。流是一個抽象層。 –