流的压缩和解压

王朝delphi·作者佚名  2006-01-09
宽屏版  字体: |||超大  

(*//

标题:流的压缩和解压

说明:适用文件压缩、图象压缩等;调用ZLib单元的方法实现

设计:Zswang

支持:wjhu111@21cn.com

日期:2004-03-24

//*)

(*//============================================================================

设计思路:

创建TCompressionStream、TDecompressionStream实例进行压缩和解压

============================================================================//*)

uses ZLib;

const cBufferSize = $4096;

function StreamCompression(mInputStream: TStream; mOutputStream: TStream): Integer;

var

I: Integer;

vBuffer: array[0..cBufferSize]of Char;

begin

Result := -1;

if not (Assigned(mInputStream) and Assigned(mOutputStream)) then Exit;

with TCompressionStream.Create(clMax, mOutputStream) do try

for I := 1 to mInputStream.Size div cBufferSize do begin

mInputStream.Read(vBuffer, cBufferSize);

Write(vBuffer, cBufferSize);

end;

I := mInputStream.Size mod cBufferSize;

if I > 0 then begin

mInputStream.Read(vBuffer, I);

Write(vBuffer, I);

end;

finally

Free;

end;

end; { StreamCompression }

function StreamDecompression(mInputStream: TStream; mOutputStream: TStream): Integer;

var

vBuffer: array[0..cBufferSize]of Char;

I: Integer;

begin

Result := -1;

if not (Assigned(mInputStream) and Assigned(mOutputStream)) then Exit;

with TDecompressionStream.Create(mInputStream) do try

repeat

I := Read(vBuffer, cBufferSize);

mOutputStream.Write(vBuffer, I);

until I = 0;

Result := mOutputStream.Size;

finally

Free;

end;

end; { StreamDecompression }

//Example

procedure TForm1.Button1Click(Sender: TObject);

var

vInputStream: TFileStream;

vOutputStream: TFileStream;

begin

vInputStream := TFileStream.Create('c:\temp\temp.exe', fmOpenRead);

vOutputStream := TFileStream.Create('c:\temp\temp.exe.z', fmCreate);

try

StreamCompression(vInputStream, vOutputStream);

finally

vInputStream.Free;

vOutputStream.Free;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

vInputStream: TFileStream;

vOutputStream: TFileStream;

begin

vInputStream := TFileStream.Create('c:\temp\temp.exe.z', fmOpenRead);

vOutputStream := TFileStream.Create('c:\temp\temp~.exe', fmCreate);

try

StreamDecompression(vInputStream, vOutputStream);

finally

vInputStream.Free;

vOutputStream.Free;

end;

end;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有