關於 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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM