C++ zip文件的解压与压缩

原创 2015年07月10日 13:02:31

1、下载解压文件的库http://download.csdn.net/detail/yimengchenxi/8887025

2、在项目中添加相关文件

在Debug中添加zlib1.dll文件,其他文件加载到项目中

3、实现的代码

#pragma comment(lib,"zlib1")

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

 FILE* fp;  //打开欲压缩文件时文件的指针
 FILE* fp1;  //创建压缩文件时的指针
 errno_t err; //错误变量的定义
 err = fopen_s(&fp, SrcName, "r+b");
 //获取文件长度
 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);
 cout << "压缩结束" << endl;
 fclose(fp1);
 return 0;
}


//解压缩文件
int 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中的数据
 /*
 int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
 uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。
 sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二
 个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest
 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解
 压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求
 在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大
 小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数
 退出后, destLen 是解压出来的数据的实际大小。
 */
 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");
 cout << "解压数据成功!" << endl;

 /*
 size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream );
 这是fwrite的MSDN标准参数表,其中buffer是需要向文件中写入的内容在内存中的首地址指针,
 size是待写入内容的每个元素的字节数,count是要写多少个元素,stream 是文件指针
 */
 fwrite(uDestBuffer, uDestBufferLen, 1, fp4);
 //cout << uDestBuffer << endl;
 fclose(fp4);
 return 0;
}






Zip Utils--简单优雅的C++接口

在codeproject上看到的大神写的,真牛逼。 地址: http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-sim...

C++ ZIP压缩文件,使用zlib库和codeproject上的zip_utils

PS; zlib库比较老了,好像是Version 1.01e。基本功能也差不多。 part1: 使用codeproject上的完整的库,大牛弄的是真的方便简单。 地址:http://www.co...

用C++实现文件压缩

乍一听,这个文件压缩的名字貌似是很高大上的,其实,在数据结构中学完Huffman树之后,就可以理解这个东西其实不是那么的高不可攀。 文件压缩 所谓文件压缩,其实就是将对应的字符编码转换为另一种占据字...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

非常简单易用的C++ Zip, Unzip 源码,强烈推荐

所有源码只有两个头文件,两个CPP文件。一对用于压缩,一对用于解压。可以单独使用,也可以组合使用。接口非常简洁,使用起来很方便。http://www.wischik.com/lu/programmer...
  • haitoo
  • haitoo
  • 2010年04月13日 22:17
  • 4415

一个很好用的zip/unzip类

好用的压缩/解压缩类。 下载页面:http://www.wischik.com/lu/programmer/zip_utils.html相关页面:http://www.codeproject.com/...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用开源库zlib压缩和解压文件

zlib,一个十分强大的开源压缩解压库,应用示范广泛,很多开源库中都有它的存在(libpng,libzplay,ffmpeg……)。 作为普通开发者只要掌握其主要的两个函数就足够用了: int c...
  • mfcing
  • mfcing
  • 2012年09月26日 17:18
  • 19251

C++ 实现zip解压缩

利用第三方 XUnzip 封装自己的解压函数。 XUnzip和封装的函数在 【 下载处:】   点击此处文字开始下载 自己封装函数好像MFC里边使用没有问题。 头文件名称MyUn...

c++使用zlib和minizip压缩文件

zlib的安装可以参照http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html这篇文章的做。我用的是1.28版本的也是可以的。 要注意的是6个项目,主要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ zip文件的解压与压缩
举报原因:
原因补充:

(最多只允许输入30个字)