請參考部分原始碼, 附件檔為完整程式 sample.
使用 zlib unit 後, 即可使用 TCompressionStream 及 TDecompressionStream, 壓縮使用 TCompressionStream, 在建立 TCompressionStream 要傳入壓縮方式及借用的 TStream, 該 TStream 的目的即為壓縮的資料, TCompressionStream 可以使用 Write 方法將資料傳入, 該 TCompressionStream 即會進行壓縮, 完成一個 buffer size 時, 就會寫入 TStream, 或是在該 TCompressionStream free 時, 也會將未滿 buffer 的資料 flush 全部寫入 TStream 中.
TDecompressionStrem 則是於 Create 時就要傳入一個 TStream 作為傳入已壓縮的資料用的來源. 再利用 Read 方法來進行解壓縮資料, 利用一個自己建立的 buffer 來進行部分解壓的讀出, 隨著 Read 方法的讀出資料, TDecompressionStream 也會傳回實際解出的資料量, 若無資料要再解壓縮時, 就傳回 0 , 即為結束.
代碼: 選擇全部
const
MaxBuf = 1024;
procedure Tform1.Button1Click(Sender: TObject);
var
cs: TCompressionStream;
fsi, fso: TMemoryStream;
begin
if OpenDialog1.Execute then
begin
if SaveDialog1.Execute then
begin
fsi:= TMemoryStream.Create;
fso:= TMemoryStream.Create;
fsi.LoadFromFile(OpenDialog1.FileName);
PrintLog('compress file: '+OpenDialog1.FileName+'('+IntToStr(fsi.Size)+')');
fsi.Position := 0;
cs:= TCompressionStream.Create(clDefault, fso);
cs.Write(PByte(fsi.Memory)^, fsi.Size);
cs.Free;
fso.SaveToFile(SaveDialog1.FileName);
PrintLog('compressed file: '+SaveDialog1.FileName+'('+IntToStr(fso.Size)+')');
fsi.Free;
fso.Free;
end;
end;
end;
procedure Tform1.Button2Click(Sender: TObject);
var
ds: TDecompressionStream;
fsi, fso: TMemoryStream;
buf: Array[0..MaxBuf -1] of Byte;
ibyteProcessed: Integer;
begin
if OpenDialog1.Execute then
begin
if SaveDialog1.Execute then
begin
fsi:= TMemoryStream.Create;
fso:= TMemoryStream.Create;
fsi.LoadFromFile(OpenDialog1.FileName);
fsi.Position := 0;
PrintLog('Decompress file: '+OpenDialog1.FileName+'('+IntToStr(fsi.Size)+')');
ds:= TDecompressionStream.Create(fsi);
repeat
ibyteProcessed := ds.Read(buf, MaxBuf);
if ibyteProcessed > 0 then
fso.Write(buf, ibyteProcessed);
until ibyteProcessed = 0;
ds.Free;
fso.SaveToFile(SaveDialog1.FileName);
PrintLog('Decompressed file: '+SaveDialog1.FileName+'('+IntToStr(fso.Size)+')');
fsi.Free;
fso.Free;
end;
end;
end;