开源代码: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文件压缩和解压的更多相关文章

  1. [充电][库]Zlib文件压缩和解压

    原文链接: http://www.cnblogs.com/fairycao/archive/2009/12/09/1620414.html 开源代码:http://www.zlib.net/zlib使 ...

  2. linux常用命令:4文件压缩和解压命令

    文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...

  3. Ionic.Zip.dll文件压缩和解压

    Ionic.Zip.dll文件压缩和解压 下载地址: http://download.csdn.net/detail/yfz19890410/5578515 1.下载Ionic.Zip.dll组件,添 ...

  4. c#自带压缩类实现的多文件压缩和解压

    用c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容.下面的代码没有把多文件的目录 ...

  5. java 文件压缩和解压(ZipInputStream, ZipOutputStream)

    最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...

  6. .net文件压缩和解压及中文文件夹名称乱码问题

    /**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...

  7. 文件压缩和解压 FileStream GZipStream

    using (FileStream reader=new FileStream (@"c:\1.txt",FileMode.Open,FileAccess.Read)) { usi ...

  8. C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用

    工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...

  9. python学习shutil模块的文件压缩和解压用法

    shutil模块可以创建压缩包并返回文件路径,例如 zip,tar,下面详细其用法 base_name 压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存指定路径 data ...

随机推荐

  1. centos6.5安装vsftp服务并配置虚拟账户ftp

      当我们的用户量越来越大时,继续创建更多的系统用户是不明智的,这时就需要为vsftpd创建虚拟账户,但vsftpd虚拟账户的数据库要保存在Berkeley DB格式的数据文件中,所以需要安装db4- ...

  2. Ajax之HTTp请求

    71.Ajax的基础概念  *运用html和css来实现页面表达信息  *运用XMLHttpRequest和web服务器进行数据的异步交换  *运用JavaScript操作DOM来实现动态局部刷新 2 ...

  3. php中文字符串反转

    <?php header("content-type:text/html;charset=utf-8"); /** 此函数的作用是反转中文字符串 mb_strlen() 获取 ...

  4. JQuery树形目录制作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  5. python模块之socket

    43.python模块之socket:       Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式 UDP通讯: Server: import socket port=8081 ...

  6. unix 环境高级编程 读书笔记与习题解答第四篇

    第一章 第六节 第一小节 这一章没有程序设计和API方面的深入学习,而是注重介绍了unix操作系统中的原始数据类型和系统原型函数,错误处理方面的知识. ____unistd.h____ 该文件包含了u ...

  7. java学习之 垃圾回收

    垃圾回收器始终以一个较低优先级的后台进程进行垃圾的回收工作,这样不会影响程序的正常工作. 通常只有当内存到达用尽的边缘而程序需要分配新的内存空间时,垃圾回收器才会执行. 垃圾回收的条件:1,垃圾回收器 ...

  8. bzoj1038: [ZJOI2008]瞭望塔

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  9. 基于 SWTBot 进行 Eclipse GUI 自动化测试

    背景简介 在软件开发领域,持续集成和部署对于软件测试自动化提出了越来越高的要求,基于 Eclipse 应用在这一需求中仍然占据重要的组成部分.目前主流的测试自动化工具主要以录制回放的功能为主,辅助以脚 ...

  10. CP30,DBCP数据源配置

    Spring中 CP30数据源配置 <!-- 加载属性文件 01--> <bean id= "propertyConfigurer" class="or ...