admin

[系统应用] 关于 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.


#1楼
发帖时间:2月前   |   查看数:0   |   回复数:0
游客组