Delphi使用zlib来压缩文件

news/2024/8/26 19:01:10
使用时,需要Zlib.pas和 Zlibconst.pas两个单元文件,这两个文件保存在 Delphi 5.0安装光盘上 InfoExtrasZlib目录下,此外,在 InfoExtrasZlibObj目录中还保存了 Zlib.pas单元引用的 Obj文件,把这个目录拷贝到delphi的lib下,即可。可以适当的改动比如增加目录压缩和分文件压缩,其实就是在文件流前面增加一部分描述结构就是,不多说。使用 时,还要use zlib单元。 两个函数如下:
procedure CompressIt(var CompressedStream: TMemoryStream; const CompressionLevel: TCompressionLevel);
// 参数是传递的流和压缩方式
var
  SourceStream: TCompressionStream;
  DestStream: TMemoryStream;
  Count: int64; //注意,此处修改了,原来是int
begin
  //获得流的原始尺寸
  Count := CompressedStream.Size;
  DestStream := TMemoryStream.Create;
  SourceStream := TCompressionStream.Create(CompressionLevel, DestStream);
  try
    //SourceStream中保存着原始的流
    CompressedStream.SaveToStream(SourceStream);
    //将原始流进行压缩, DestStream中保存着压缩后的流
    SourceStream.Free;
    CompressedStream.Clear;
    //写入原始图像的尺寸
    CompressedStream.WriteBuffer(Count, SizeOf(Count));
    //写入经过压缩的流
    CompressedStream.CopyFrom(DestStream, 0);
  finally
    DestStream.Free;
  end;
end;


procedure UnCompressit(const CompressedStream: TMemoryStream; var UnCompressedStream: TMemoryStream);
//参数 压缩过的流,解压后的流
var
  SourceStream: TDecompressionStream;
  DestStream: TMemoryStream;
  Buffer: PChar;
  Count: int64;
begin
  //从被压缩的图像流中读出原始的尺寸
  CompressedStream.ReadBuffer(Count, SizeOf(Count));
  //根据尺寸大小为将要读入的原始流分配内存块
  GetMem(Buffer, Count);
  DestStream := TMemoryStream.Create;
  SourceStream := TDecompressionStream.Create(CompressedStream);
  try
    //将被压缩的流解压缩,然后存入 Buffer内存块中
    SourceStream.ReadBuffer(Buffer^, Count);
    //将原始流保存至 DestStream流中
    DestStream.WriteBuffer(Buffer^, Count);
    DestStream.Position := 0; //复位流指针
    DestStream.Position := length(VER_INFO);
    //从DestStream流中载入图像流
    UnCompressedStream.LoadFromStream(DestStream);
  finally
    FreeMem(Buffer);
    DestStream.Free;
  end;
end;

使用的例子如下:
procedure TForm1.Button5Click(Sender: TObject);
//把指定文件压缩然后保存为另外一个压缩包,
//呵呵,我使用的时候是把后缀改成cab,可以唬一些人吧?
var
  SM: TMemoryStream;
begin
  if OpenDialog1.Execute then
  begin
    if SaveDialog1.Execute then
    begin
      SM := TMemoryStream.Create;
      try
        Sm.LoadFromFile(OpenDialog1.FileName);
        SM.Position := 0;
        Compressit(sm, clDefault);
        sm.SaveToFile(SaveDialog1.FileName);
      finally
        SM.Free;
      end;
    end;
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
//把指定的压缩包解成原来的文件。
var
  SM, DM: TMemoryStream;
begin
  if OpenDialog1.Execute then
  begin
    if SaveDialog1.Execute then
    begin
      SM := TMemoryStream.Create;
      DM := TMemoryStream.Create;
      try
        Sm.LoadFromFile(OpenDialog1.FileName);
        SM.Position := 0;
        UnCompressit(sm, dm);
        dm.Position := 0;
        dm.SaveToFile(SaveDialog1.FileName);
      finally
        SM.Free;
        DM.Free;
      end;
    end;
  end;
end;

http://www.niftyadmin.cn/n/4821457.html

相关文章

Linq 动态查询库

【原文地址】Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library) 【原文发表日期】 Monday, January 07, 2008 11:02 PM LINQ (语言级集成查询)是VS 2008 和 .NET 3.5中提供的一个新特性。LINQ使得数据查询的概念成为.NET中的一等编程概念&a…

CentOS下screen 命令详解

一、背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它…

javascript的fn方法(转)

jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。 jQuery.fn.extend(object);给jQuery对象添加方法。 fn 是什么东西呢。查看jQuery代码&#…

typedef的常用用法

1.常规变量类型定义 例如:typedef unsigned char uchar 描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明 2.数组类型定义 例如: typedef int array[2]; 描述: array等价于 int [2]定义; …

Spark-Shell交互式客户端

启动交互shell [roothdp-1 bin]# ./spark-shell --master spark://hdp-2:7077 --executor-memory 500m --total-executor-cores 1 --master spark://hdp-2:7077 sparkmaster节点的地址 --executor-memory 500m --total-executor-cores 1 运行wordcount程序 sc.textFil…

查看Centos系统最近一次启动时间和运行时间

1.uptime命令[sql] view plaincopy [sparkMaster Log_Data]$ uptime 09:18:01 up 20:17, 1 user, load average: 0.13, 0.12, 0.14 2.查看/proc/uptime文件计算系统启动时间[sql] view plaincopy [sparkMaster Log_Data]$ cat /proc/uptime 73064.44 276161.85 输出: 73…

解决 | Beyond Compare打开报错

Beyond Compare打开报错 删除C:\Users\Administrator\AppData\Roaming\Scooter Software\Beyond Compare 3下的所有文件

CentOS系统资源常用命令

系统: # uname -a # 查看内核/操作系统/CPU信息 # cat /etc/issue # cat /etc/redhat-release # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod …