zoukankan      html  css  js  c++  java
  • Delphi7 流操作_压缩

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    edt1: TEdit;
    btn3: TButton;
    btn4: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}
    uses Zlib;//delphi7 自带这Zlib.pas

    //压缩
    procedure TForm1.btn1Click(Sender: TObject);
    var
    cs:TCompressionStream;
    fs,ms:TMemoryStream;
    num:Integer;
    begin
    {第一步: 调入要压缩的文件, 并获取大小}
    fs:=TMemoryStream.Create;
    fs.LoadFromFile('a.fr3');
    num:=fs.Size;

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

    {第三步: 压缩}
    cs:=TCompressionStream.Create(clMax,ms); //压缩比例最大化,ms为接受流
    fs.SaveToStream(cs); //保存流到压缩流
    cs.Free; {压缩流 Free 后才真正完成压缩, 所以提前 Free}
    ms.SaveToFile('a.zipx'); //delphi通过zlib压缩后生成的文件,winnar解压不了
    ms.Free;
    fs.Free;
    end;

    //解压缩
    procedure TForm1.btn2Click(Sender: TObject);
    var
    ds: TDecompressionStream; {解压流}
    fs,ms: TMemoryStream; {fs 是准备要解压的流; ms 是接受解压数据的流}
    num: Integer; {接受文件压缩前的大小}
    begin
    {第一步: 准要解压的文件}
    fs := TMemoryStream.Create;
    fs.LoadFromFile('a.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('b.fr3');

    ds.Free;
    ms.Free;
    fs.Free;
    end;

    //序列化
    procedure TForm1.btn3Click(Sender: TObject);
    var
    stream:TStream;
    const
    path='m.dat';
    begin
    stream:=TFileStream.Create(path,fmCreate);
    stream.WriteComponentRes(edt1.ClassName,edt1); //写入资源到文件,edt1.ClassName可以为'xxx'等,可以随便命名
    stream.Free;
    end;

    //反序列化
    procedure TForm1.btn4Click(Sender: TObject);
    var
    stream:TStream;
    const
    path='m.dat';
    begin
    stream:=TFileStream.Create(path,fmOpenRead);
    stream.ReadComponentRes(edt1); //读取资源到控件
    stream.Free;
    end;

    end.

    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    C++字符串(srtring)反转
    字典(Dictionary)
    畅通工程
    子串计算
    神奇的口袋
    SLT 优先队列 哈弗曼树最小带权路径
    大数阶乘
    整数拆分
    A+B (带有,的数字)
    Hdu 1232 畅通工程
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12169733.html
Copyright © 2011-2022 走看看