Zlib文件压缩和解压
原文地址为: 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);
};
接口实现:
压缩
{
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 ;
}
解压
{
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");
上述代码对于大文件就不适合了,因为是一次读出,一次写入的,下面是针对大文件的改进,分批读,分批写,代码如下:
{
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文件压缩和解压相关推荐
- python调用程序压缩文件_Python实现文件压缩和解压的示例代码
大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...
- Linux的zip压缩文件压缩和解压
Linux的zip压缩文件压缩和解压 <Linux一线运维实战>清华大学出版社(即将出版) 通常,系统中的文件的可以被直接打开的,这就难免文件的内容被查看.另外,对于要归档保存的(压缩)文 ...
- android文件压缩库,Android文件压缩和解压
Android文件压缩和解压 Java代码 package com.maidong.utils; import java.io.BufferedInputStream; import java.io. ...
- python解压文件_使用Python实现文件压缩和解压
大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...
- c++创建文件_使用Python实现文件压缩和解压
(点击上方快速关注并设置为星标,一起学Python) 来源:网络 大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Pyt ...
- java压缩和解压流,实现文件压缩和解压,代码都有注释
压缩和解压流 压缩文件: ZipOutputStream 常用方法 方法名 介绍 ZipOutputStream(OutputStream out) 构造方法:创建新的ZIP输出流 public vo ...
- Linux文件压缩和解压命令【gzip、gunzip、zip、unzip、tar】【详细总结】
解压和压缩 gzip/gunzip gzip 压缩文件 gunzip 解压缩文件 zip/unzip zip 命令语法 命令选项 实例 unzip 语法: 命令选项 实例 tar 语法 实例 例一:将 ...
- 利用JUZ包实现文件压缩和解压
压缩解压过程还是用IO流对文件的读写操作 本质还是对API的引用,代码逻辑比较简单,相关注释比较详细,请在代码中查看 代码已跑通,可自行copy测试 注:1. 在压缩文件时,传入的压缩文件路径必须是以 ...
- LINUX学习之文件压缩和解压命令(六)
gzip/gunzip 命令描述 gzip:压缩文件,将文件压缩为.gz文件 gunzip:解压.gz文件 使用此命令要注意以下几点: 只能压缩文件,不能压缩目录 不保留原先文件 若有多个文件会产生多 ...
- c语言文件压缩与解压缩实验报告,哈弗曼树的文件压缩和解压实验报告(C语言).doc...
Lab05 树结构的应用 学号: 姓名: 实验时间:2011.5.24 1.问题描述 哈弗曼树的编码与译码 - 功能:实现对任何类型文件的压缩与解码 - 输入:源文件,压缩文件 - 输出:解码正确性判 ...
最新文章
- ThreeJS的特效合成器和后期处理通道
- 如何听节拍器_我是如何开垮一家琴行的!
- [置顶] NoSQl mongodb数据库 配置篇
- 数学狂想曲(七)——莱洛三角形
- 信息系统管理19年真题选择题
- jzoj1252,P5194-天平【dfs,set】
- LeetCode 1086. 前五科的均分(map + 优先队列)
- TypeScript BigInt
- 如何创建隐藏用户帐号
- 二等水准数据平差_二等水准平差软件
- Arora is a lightweight cross-platform web browser.
- Pytorch 版本的lookahead 优化函数使用(附代码)
- 移动端h5 下拉框 demo (原生的也太丑了把)
- 基于Processing的躲避球游戏
- linux定时删除前几天日志的定时任务
- 在线客服服务干货:如何与客户进行有效沟通?
- 网站收录查询,常用的2种网站收录查询方法
- 虚拟机安装mysql步骤
- 003--北大考研计算机--考研经验贴
- 红外遥控小灯亮灭及修改版