流压缩 解压 Zlib

procedure TForm1.Button3Click(Sender: TObject);
var
  beforeMS,afterMS:TMemoryStream;  {beforeMS 是要压缩的流; afterMS 是接收压缩后文件的流}
  cS:TCompressionStream;   {定义压缩流}
  num:Integer;             {原始文件大小}
begin
  {第一步: 调入要压缩的文件, 并获取大小}
  beforeMS:=TMemoryStream.Create;
  beforeMS.LoadFromFile('F:\cc.doc');
  num:=beforeMS.Size;

  {第二步: 建立接收的流, 并先写入原始文件大小}
  afterMS:=TMemoryStream.Create;
  afterMS.Write(num,SizeOf(num));

  {第三步: 压缩}
  cS:=TCompressionStream.Create(clMax,afterMS); {参数1是压缩比; 参数2是接收流}
  beforeMS.SaveToStream(cS);  {传入要压缩的数据}
  cS.Free;   {压缩流 Free 后才真正完成压缩, 所以提前 Free}

  {第四步: 保存}
  afterMS.SaveToFile('F:\cc.press');

  {第五步: 释放}
  beforeMS.Free;
  afterMS.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  souMS,desMS:TMemoryStream;
  dS:TDecompressionStream;
  num:Integer;
begin
  {第一步: 准要解压的文件}
  souMS:=TMemoryStream.Create;
  souMS.LoadFromFile('F:\cc.press');

  {第二步: 读出文件压缩前的大小}
  souMS.Position := 0;
  souMS.ReadBuffer(num,SizeOf(num));

  {第三步: 准备好要接收的流, 并设置需要的大小}
  desMS:=TMemoryStream.Create;
  desMS.SetSize(num);

  {第四步: 解压}
  dS:=TDecompressionStream.Create(souMS);  {参数是要解压的流}

  {第五步: 把解压后的数据读出存放到已准备好接收的流}
  dS.Read(desMS.Memory^,num);
  dS.Free;

  {第六步: 保存}
  desMS.SaveToFile('F:\jy.doc');

  desMS.Free;
  souMS.Free;
end;

 

posted @ 2012-05-21 14:33  ftwsnow  阅读(321)  评论(0)    收藏  举报