原文地址为: Zlib文件压缩和解压

开源代码: http://www.zlib.net/
zlib使用手册: http://www.zlib.net/manual.html
zlib wince版: http://www.tenik.co.jp/~adachi/wince/
在这里,你可以查看基于各种操作系统平台的 压缩与解缩代码实现。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
以下是经过测试的 WinCE 及 WinXP 下的代码

<<<<<<<<
第一步: 首先到http://www.zlib.net/下载个ZLIB,
             WinXP: 解压缩后打开zlib-1.2.3\projects\visualc6\zlib.dsw,选择Win32 LIB Release 按F7编绎生成zlib.lib, zlib.dll.
            WinCE: 下载一个for Windows CE 版的包,里面针对各种平台(ARM4, ARM4I, MIPS, X86)有对应的zlibce.dll zlibce.lib.

<<<<<<<<
第二步: 建立EVC 或者 VS2005 的对话框工程.
             在工程中添加以下文件:zlib.h, zconf.h, zlib.lib, zlib.dll (或者 zlibce.dll);
            这3个文件就在刚才从http://www.zlib.net/下载的软件包中.

<<<<<<<<
第三步: 包含头文件
#include "zlib.h"

主要使用fopen等C标准接口实现的,只用到zlib的Compress()和UnCompress()接口;里面的条件编译是针对PC和WCE的

封装的类:

class CZlib
{
public:
 CZlib();
 ~ CZlib();
 int Compress(char * DestName,const char *SrcName);
 int UnCompress(char * DestName,const char *SrcName);
};

接口实现:

压缩

代码

int  CZlib::Compress( char   *  DestName, const   char   * SrcName)
{
     char  SourceBuffer[ 102400 ]  =  { 0 };   // 压缩文件时的源buffer

FILE *  fp;   // 打开欲压缩文件时文件的指针
    FILE *  fp1;   // 创建压缩文件时的指针

errno_t err;  // 错误变量的定义
#ifdef WINDOWS_PLATFORM
    err  =  fopen_s( & fp,SrcName, " r+b " ); // 打开欲压缩的文件
     if (err)
    {
        printf( " 文件打开失败! \n " );
         return   1 ;
    }
#endif  
#ifdef    WINDOWS_CE_PLATFORM
    fp  =  fopen_s(SrcName, " r+b " ); // 打开欲压缩的文件
if (fp)
    {
        printf( " 文件打开失败! \n " );
         return   1 ;
    }

#endif

// 获取文件长度
     long  cur  =  ftell(fp);
    fseek(fp, 0L ,SEEK_END);
     long  fileLength  =  ftell(fp);
    fseek(fp,cur,SEEK_SET);

// 读取文件到buffer
    fread(SourceBuffer,fileLength, 1 ,fp);
    fclose(fp);

// 压缩buffer中的数据
    uLongf SourceBufferLen = 102400 ;
     char *  DestBuffer = ( char * )::calloc((uInt)SourceBufferLen,  1 );
    err = compress((Bytef * )DestBuffer,(uLongf * ) & SourceBufferLen,( const  Bytef * )SourceBuffer,(uLongf)fileLength);
     if (err != Z_OK)
    {
        cout << " 压缩失败: " << err << endl;
         return   1 ;
    }
    
     // 创建一个文件用来写入压缩后的数据
    err  =  fopen_s( & fp1, DestName, " w+b " );
     if ( ! fp1)
    {
        printf( " 压缩文件创建失败! \n " );
         return   1  ;
    }

fwrite(DestBuffer,SourceBufferLen, 1 ,fp1);
    fclose(fp1);
     return   0 ;
}

解压

代码

int  CZlib::UnCompress( char   *  DestName, const   char   * SrcName)
{
     char  uSorceBuffer[ 102400 ]  =  { 0 };   // 解压缩文件时的源buffer
    FILE *  fp3;   // 打开欲解压文件的文件指针
    FILE *  fp4;   // 创建解压文件的文件指针
    errno_t err;  // 错误变量的定义
     // 打开欲解压的文件
    err  =  fopen_s( & fp3,SrcName, " r+b " );
     if (err)
    {
        printf( " 文件打开失败! \n " );
         return   1 ;
    }

// 获取欲解压文件的大小
     long  ucur  =  ftell(fp3);
    fseek(fp3, 0L ,SEEK_END);
     long  ufileLength  =  ftell(fp3);
    fseek(fp3,ucur,SEEK_SET);

// 读取文件到buffer
    fread(uSorceBuffer,ufileLength, 1 ,fp3);
    fclose(fp3);

uLongf uDestBufferLen = 1024000 ; // 此处长度需要足够大以容纳解压缩后数据
     char *  uDestBuffer = ( char * )::calloc((uInt)uDestBufferLen,  1 );
     // 解压缩buffer中的数据
    err = uncompress((Bytef * )uDestBuffer,(uLongf * ) & uDestBufferLen,(Bytef * )uSorceBuffer,(uLongf)ufileLength);

if (err != Z_OK)
    {
        cout << " 解压缩失败: " << err << endl;
         return   1 ;
    }

// 创建一个文件用来写入解压缩后的数据
    err  =  fopen_s( & fp4,DestName, " wb " );
     if (err)
    {
        printf( " 解压缩文件创建失败! \n " );
         return   1  ;
    }

printf( " 写入数据... \n " );
    fwrite(uDestBuffer,uDestBufferLen, 1 ,fp4);
    fclose(fp4);
     return   0 ;
}

测试代码:

test.Compress("1.zip","test.docx");

test.UnCompress("11.docx","1.zip");

上述代码对于大文件就不适合了,因为是一次读出,一次写入的,下面是针对大文件的改进,分批读,分批写,代码如下:

代码

WF_Error CZlib::Compress( const   char   *  DestName, const   char   * SrcName)
{
    FILE  *  fp_in  =  NULL; int  len  =   0 ; char  buf[ 16384 ];

WF_Error re  =  WF_OK;
    
     if ( NULL  ==  (fp_in  =  fopen(SrcName, " rb " )))
    {
         return  WF_FAIL;
    }

/
    gzFile  out   =  gzopen(DestName, " wb6f " );
    
     if ( out   ==  NULL)
    {
         return  WF_FAIL;
    }

for (;;)
    {
        len  =  fread(buf, 1 , sizeof (buf),fp_in);
        
         if (ferror(fp_in))
        {
            re  =  WF_FAIL;
             break ;
        }
        
         if (len  ==   0 )  break ;

if (gzwrite( out , buf, (unsigned)len)  !=  len)
        {
            re  =  WF_FAIL;
        }
    }

gzclose( out );

fclose(fp_in);

return  re;
 }

WF_Error CZlib::UnCompress( const   char   *  DestName, const   char   * SrcName)
{
    FILE  *  fp_out  =  NULL;WF_Error re  =  WF_OK;
    
    gzFile  in ; int  len  =   0 ; char  buf[ 16384 ];

in   =  gzopen(SrcName, " rb " );

if ( in   ==  NULL)
    {
         return  WF_FAIL;
    }

if (NULL  ==  (fp_out  =  fopen(DestName, " wb " )))
    {
        gzclose( in );
         return  WF_FAIL;
    }
    
     for  (;;)
    {
        len  =  gzread( in ,buf, sizeof (buf));

if (len  <   0 )
        {
            re  =  WF_FAIL;
             break ;
        }

if (len  ==   0 )  break ;

if (fwrite(buf, 1 ,(unsigned)len,fp_out) != len)
        {
            re  =  WF_FAIL;
             break ;
        }
    }

fclose(fp_out);
    gzclose( in );

return  re;
}

转载请注明本文地址: Zlib文件压缩和解压

Zlib文件压缩和解压相关推荐

  1. python调用程序压缩文件_Python实现文件压缩和解压的示例代码

    大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...

  2. Linux的zip压缩文件压缩和解压

    Linux的zip压缩文件压缩和解压 <Linux一线运维实战>清华大学出版社(即将出版) 通常,系统中的文件的可以被直接打开的,这就难免文件的内容被查看.另外,对于要归档保存的(压缩)文 ...

  3. android文件压缩库,Android文件压缩和解压

    Android文件压缩和解压 Java代码 package com.maidong.utils; import java.io.BufferedInputStream; import java.io. ...

  4. python解压文件_使用Python实现文件压缩和解压

    大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...

  5. c++创建文件_使用Python实现文件压缩和解压

    (点击上方快速关注并设置为星标,一起学Python) 来源:网络 大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Pyt ...

  6. java压缩和解压流,实现文件压缩和解压,代码都有注释

    压缩和解压流 压缩文件: ZipOutputStream 常用方法 方法名 介绍 ZipOutputStream(OutputStream out) 构造方法:创建新的ZIP输出流 public vo ...

  7. Linux文件压缩和解压命令【gzip、gunzip、zip、unzip、tar】【详细总结】

    解压和压缩 gzip/gunzip gzip 压缩文件 gunzip 解压缩文件 zip/unzip zip 命令语法 命令选项 实例 unzip 语法: 命令选项 实例 tar 语法 实例 例一:将 ...

  8. 利用JUZ包实现文件压缩和解压

    压缩解压过程还是用IO流对文件的读写操作 本质还是对API的引用,代码逻辑比较简单,相关注释比较详细,请在代码中查看 代码已跑通,可自行copy测试 注:1. 在压缩文件时,传入的压缩文件路径必须是以 ...

  9. LINUX学习之文件压缩和解压命令(六)

    gzip/gunzip 命令描述 gzip:压缩文件,将文件压缩为.gz文件 gunzip:解压.gz文件 使用此命令要注意以下几点: 只能压缩文件,不能压缩目录 不保留原先文件 若有多个文件会产生多 ...

  10. c语言文件压缩与解压缩实验报告,哈弗曼树的文件压缩和解压实验报告(C语言).doc...

    Lab05 树结构的应用 学号: 姓名: 实验时间:2011.5.24 1.问题描述 哈弗曼树的编码与译码 - 功能:实现对任何类型文件的压缩与解码 - 输入:源文件,压缩文件 - 输出:解码正确性判 ...

最新文章

  1. ThreeJS的特效合成器和后期处理通道
  2. 如何听节拍器_我是如何开垮一家琴行的!
  3. [置顶] NoSQl mongodb数据库 配置篇
  4. 数学狂想曲(七)——莱洛三角形
  5. 信息系统管理19年真题选择题
  6. jzoj1252,P5194-天平【dfs,set】
  7. LeetCode 1086. 前五科的均分(map + 优先队列)
  8. TypeScript BigInt
  9. 如何创建隐藏用户帐号
  10. 二等水准数据平差_二等水准平差软件
  11. Arora is a lightweight cross-platform web browser.
  12. Pytorch 版本的lookahead 优化函数使用(附代码)
  13. 移动端h5 下拉框 demo (原生的也太丑了把)
  14. 基于Processing的躲避球游戏
  15. linux定时删除前几天日志的定时任务
  16. 在线客服服务干货:如何与客户进行有效沟通?
  17. 网站收录查询,常用的2种网站收录查询方法
  18. 虚拟机安装mysql步骤
  19. 003--北大考研计算机--考研经验贴
  20. 红外遥控小灯亮灭及修改版

热门文章

  1. 方法重写与方法重载的区别详解
  2. Java方法的重载和重写
  3. b站视频下载和字幕下载的方法
  4. Flutter+原生开发与H5+原生开发的区别在哪里?
  5. Java将JSON对象或JSON数组转list对象
  6. 10X Genomics单细胞转录组测序
  7. 一个网站查遍所有英文文章 “会议地点及出版商”(亲测搜了80篇全部有效)
  8. 小说APP源码,实现带下划线的密码输入框
  9. python-docx页眉横线
  10. c语言 文件指针移动一位,c语言怎样移动文件指针到制定位置?