Zlib文件压缩和解压
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文件压缩和解压
原文链接: http://www.cnblogs.com/fairycao/archive/2009/12/09/1620414.html 开源代码:http://www.zlib.net/zlib使 ...
- linux常用命令:4文件压缩和解压命令
文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...
- Ionic.Zip.dll文件压缩和解压
Ionic.Zip.dll文件压缩和解压 下载地址: http://download.csdn.net/detail/yfz19890410/5578515 1.下载Ionic.Zip.dll组件,添 ...
- c#自带压缩类实现的多文件压缩和解压
用c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容.下面的代码没有把多文件的目录 ...
- java 文件压缩和解压(ZipInputStream, ZipOutputStream)
最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...
- .net文件压缩和解压及中文文件夹名称乱码问题
/**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...
- 文件压缩和解压 FileStream GZipStream
using (FileStream reader=new FileStream (@"c:\1.txt",FileMode.Open,FileAccess.Read)) { usi ...
- C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用
工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...
- python学习shutil模块的文件压缩和解压用法
shutil模块可以创建压缩包并返回文件路径,例如 zip,tar,下面详细其用法 base_name 压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存指定路径 data ...
随机推荐
- Oracle数据库之PL/SQL包
Oracle数据库之PL/SQL包 1. 简介 包(PACKAGE)是一种数据对象,它是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来 ...
- jQuery判断文本框是否为空
1.引用jQuery库 <script src="/static/js/jquery_v1.6.1.js" type="text/javascript"& ...
- asp.net在应用母版的页面下采用了ModalPopupExtender弹出窗中应用autocomplete
autocomplete是jqueryUI的一个插件,可以实现自动填充的功能. 要点:1.应用了母版页,所以取页面上控件的ID时与一般方法不同 2.由于用了ajax的updatepanel,所以会出现 ...
- aix7安装was7、打补丁、更改访问端口、手动启动was、配置was7、部署项目
1:准备工作 首先了解下我们下面即将用到的aix命令,以及安装包.补丁安装工具.补丁 was7的安装包以及补丁工具都是压缩包形式并且以.tar.gz结尾的 安装包在800MB左右,通常为****_w ...
- java 全角、半角字符串转换
转自:http://www.cnblogs.com/modou/articles/2679815.html 加入了空字符串的验证 半角转全角的方法: /** * @Title: ToSBC * ...
- curl http_code状态码 含义
curl爬取过程中,会返回一个http_code,下面是他们的意义信息 $http_code["]="Unable to access"; $http_code[&quo ...
- 简单学C——第一天
基本功 一.数据类型: 在C语言中,有数据类型这一说法.为何有这一说法?是因为在现实生活中存在着不同的数据,(例如整数,小数,字符即a b c d , . ; " 之类).由于计算机中所有 ...
- OC 之 谓词
NSPredicate 分类: Objective-C iOS XCode Mac2012-10-26 17:26 10557人阅读 评论(1) 收藏 举报 简述:Cocoa框架中的NSPredica ...
- android中使用intent来实现Activity带数据跳转
大家都知道startActivity()是用来切换跳转Activity的.如果想要在另个Activity中出书数据的话.只需要在源activity中使用intent.putExtra()方法传出数据. ...
- 简述MVC思想 与PHP如何实现MVC
我相信已经有很多这样的文章了,但是我今天还是愿意把自己的经验与大家分享一下.纯属原创,我也没什么保留,希望对新手有帮助,有说的不对的地方,也欢迎指出. 什么是MVC? 简单的说就是将网站源码分类.分层 ...