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;