
对Zlib单元进行再封装
低版本DELPHI,如D7,ZLIB.pas单元封装的很简陋,因此有必要再封装,以增加使用的便利性。
高版本DELPHI,zlib.pas本身提供的接口已经相当完善。
Zlib.pas是DELPHI自带的压缩单元,下面对对Zlib单元进行再封装,增加两个压缩函数,一个压缩流,一个压缩字符串:
分别在D7和XE10.3.1下面,测试通过。
unit Unit1; interface uses
ZLib, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs; type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
// 两个过程都有Compress参数,这个参数用来决定进行压缩操作还是解压操作: True--压缩; false--解压.
procedure Zip(Input, Output: TStream; Compress: Boolean); overload; function Zip(Input: string; Compress: Boolean): string; overload; implementation {$R *.dfm} procedure Zip(Input, Output: TStream; Compress: Boolean);
const
MAXBUFSIZE = 1024 * 16; //16 KB
var
CS: TCompressionStream;
DS: TDecompressionStream;
Buf: array[0..MAXBUFSIZE - 1] of Byte;
BufSize: Integer;
begin
if Assigned(Input) and Assigned(Output) then
begin
if Compress then // 压缩
begin
CS := TCompressionStream.Create(ZLib.clDefault, Output);
try
CS.CopyFrom(Input, 0); //从开始处复制
finally
CS.Free;
end;
end
else
begin // 解压
DS := TDecompressionStream.Create(Input);
try
BufSize := DS.Read(Buf, MAXBUFSIZE);
while BufSize > 0 do
begin
Output.Write(Buf, BufSize);
BufSize := DS.Read(Buf, MAXBUFSIZE);
end;
finally
DS.Free;
end;
end;
end;
end; function Zip(Input: string; Compress: Boolean): string;
var
InputStream, OutputStream: TStringStream;
begin
if Input = '' then
Exit;
InputStream := TStringStream.Create(Input);
try
OutputStream := TStringStream.Create('');
try
Zip(InputStream, OutputStream, Compress);
Result := OutputStream.DataString;
finally
OutputStream.Free;
end;
finally
InputStream.Free;
end;
end; end.