• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

使用zlib来压缩文件_Delphi

Delphi 搞代码 3年前 (2018-08-09) 186次浏览 已收录 0个评论

今天用到压缩文件的问题,找了一些网上的资料,后来发现了Delphi自身所带的zlib单元,根据例子稍微改变了一些,使它能够符合所有的格式。
使用时,需要Zlib.pas和 Zlibconst.pas两个单元文件,这两个文件保存在 Delphi 5.0安装光盘上 /Info/Extras/Zlib目录下,此外,在 Info/Extras/Zlib/Obj目录中还保存了 Zlib.pas单元引用的 Obj文件,把这个目录拷贝到delphi的lib下,即可。

原来提供的例子是抓计算机屏幕,现在改成文件流,适应所有情况。也可以适当的改动比如增加目录压缩和分文件压缩,其实就是在文件流前面增加一部分描述结构就是,不多说。使用 时,还要use zlib单元。
两个函数如下

procedure CompressIt(var CompressedStream: TMemoryStream; const CompressionLevel: TCompressionLevel);
// 参数是传递的流和压缩方式
var
   SourceStream: TCompressionStream;

http://www.gaodaima.com/65638.html使用zlib来压缩文件_Delphi

   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;

欢迎大家阅读《使用zlib来压缩文件_Delphi》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址