关于 Delphi 中流的使用(7) 压缩与解压缩(TCompressionStream、TDecompressionStream)


unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



uses Zlib; {压缩流 TCompressionStream 与解压缩流 TDecompressionStream 来自 Zlib 单元}





//压缩

procedure TForm1.Button1Click(Sender: TObject);

var

  cs: TCompressionStream; {定义压缩流}

  fs,ms: TMemoryStream;   {fs 是要压缩的流; ms 是接收压缩后文件的流}

  num: Integer;           {原始文件大小}

begin

  {第一步: 调入要压缩的文件, 并获取大小}

  fs := TMemoryStream.Create;

  fs.LoadFromFile('c:\temp\test.txt'); {文件要存在啊}

  num := fs.Size;



  {第二步: 建立接收的流, 并先写入原始文件大小}

  ms := TMemoryStream.Create;

  ms.Write(num, SizeOf(num));



  {第三步: 压缩}

  cs := TCompressionStream.Create(clMax, ms); {参数1是压缩比; 参数2是接收流}

  fs.SaveToStream(cs); {传入要压缩的数据}

  cs.Free;             {压缩流 Free 后才真正完成压缩, 所以提前 Free}



  {第四步: 保存}

  ms.SaveToFile('c:\temp\test.zipx');



  {第五步: 释放}

  ms.Free;

  fs.Free;



{压缩比参数:

  clNone    无压缩

  clFastest 快速

  clDefault 默认

  clMax     最大比例

}

end;





//解压缩

procedure TForm1.Button2Click(Sender: TObject);

var

  ds: TDecompressionStream; {解压流}

  fs,ms: TMemoryStream;     {fs 是准备要解压的流; ms 是接受解压数据的流}

  num: Integer;             {接受文件压缩前的大小}

begin

  {第一步: 准要解压的文件}

  fs := TMemoryStream.Create;

  fs.LoadFromFile('c:\temp\test.zipx'); {必须是上一个压缩方法生成的文件}



  {第二步: 读出文件压缩前的大小}

  fs.Position := 0;

  fs.ReadBuffer(num,SizeOf(num));



  {第三步: 准备好要接收的流, 并设置需要的大小}

  ms := TMemoryStream.Create;

  ms.SetSize(num);



  {第四步: 解压}

  ds := TDecompressionStream.Create(fs); {参数是要解压的流}



  {第五步: 把解压后的数据读出存放到已准备好接收的流}

  ds.Read(ms.Memory^, num);



  {第六步: 保存}

  ms.SaveToFile('c:\temp\test2.txt');



  ds.Free;

  ms.Free;

  fs.Free;

end;



end.


 
   

你可能感兴趣的:(compression)