场景:

1. zlib库跨平台,Windows和MacOSX都可以使用,还支持64位编译,轻量级,没有不用的道理。

2. 处理.zip,apk,docx文件时,因为这类文件都是zip格式,使用zlib能方便提取压缩文件里的数据。

方法:

1. 除了要使用zlib库本身,还需要使用zlib里的contrib目录minizip部分头文件和.c文件。

zlib-1.2.5/src/contrib/minizip/unzip.h

unzip.c,ioapi.c,ioapi.h (windows还需要 iowin32.h, iowind32.c)

2. 例子,读取压缩文件里的某个文件到内存std::string, 基本原理就是打开zip文件,定位需要读取的文件,之后读取这个文件,关闭zip文件。

以下代码只支持Mac.

#include "zip/zip_util.h"#include <iostream>
#include <string>
#include <algorithm>
#include <stdlib.h>#include <zlib.h>
#include "zip/unzip.h"using namespace std;#define WRITEBUFFERSIZE (1242880) // 5Mb bufferstring ZipUtil::ReadZipFile(string zipFile, string fileInZip) {int err = UNZ_OK;                 // error statusuInt size_buf = WRITEBUFFERSIZE;  // byte size of buffer to store raw csv datavoid* buf;                        // the bufferstring sout;                      // output stringschar filename_inzip[256];         // for unzGetCurrentFileInfounz_file_info file_info;          // for unzGetCurrentFileInfounzFile uf = unzOpen64(zipFile.c_str()); // open zipfile streamif (uf==NULL) {cerr << "Cannot open " << zipFile << endl;return sout;} // file is openif ( unzLocateFile(uf,fileInZip.c_str(),1) ) { // try to locate file inside zip// second argument of unzLocateFile: 1 = case sensitive, 0 = case-insensitivecerr << "File " << fileInZip << " not found in " << zipFile << endl;return sout;} // file inside zip foundif (unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0)) {cerr << "Error " << err << " with zipfile " << zipFile << " in unzGetCurrentFileInfo." << endl;return sout;} // obtained the necessary details about file inside zipbuf = (void*)malloc(size_buf); // setup bufferif (buf==NULL) {cerr << "Error allocating memory for read buffer" << endl;return sout;} // buffer readyerr = unzOpenCurrentFilePassword(uf,NULL); // Open the file inside the zip (password = NULL)if (err!=UNZ_OK) {cerr << "Error " << err << " with zipfile " << zipFile << " in unzOpenCurrentFilePassword." << endl;return sout;} // file inside the zip is open// Copy contents of the file inside the zip to the buffercout << "Extracting: " << filename_inzip << " from " << zipFile << endl;do {err = unzReadCurrentFile(uf,buf,size_buf);if (err<0) {cerr << "Error " << err << " with zipfile " << zipFile << " in unzReadCurrentFile" << endl;sout = ""; // empty output stringbreak;}// copy the buffer to a stringif (err>0) for (int i = 0; i < (int) err; i++) sout.push_back( *(((char*)buf)+i) );} while (err>0);err = unzCloseCurrentFile (uf);  // close the zipfileif (err!=UNZ_OK) {cerr << "Error " << err << " with zipfile " << zipFile << " in unzCloseCurrentFile" << endl;sout = ""; // empty output string}unzClose(uf);free(buf); // free up buffer memoryreturn sout;
}

Windows的路径需要Unicode才能支持中文路径,所以用以下的UnzOpen64实现:

unzFile ZipUtil::UnzOpen64(const char* path)
{zlib_filefunc64_def ffunc;  fill_win32_filefunc64W(&ffunc);  wchar_t* temp_path = Utf82Unicode(path);  unzFile zf = unzOpen2_64(temp_path,&ffunc);return zf;
}

[Zlib]_[初级]_[使用zlib库解压提取文件]相关推荐

  1. 使用zlib库解压*.zip文件

    1.编辑zlib静态库 1)实现zip文件压缩和解压的zlib库部分代码(基于zlib-1.2.5) 这是zlib-1.2.5源码:http://download.csdn.net/download/ ...

  2. [zlib]_[初级]_[使用Zlib完整解压zip内容]

    场景: 1. 解压文件一般用在下载了一个zip文件之后解压,或者分析某个文件需要解压的操作上. 2. 解压文件,特别是解压带文件夹的zip文件往往系统没有提供这类Win32 API,当然C#自带库能解 ...

  3. Linux C语言 Zlib 实现解压zip文件

    Linux C语言 Zlib 实现解压zip文件 因为在做嵌入式Linux,做OTA功能的时候需要解压zip升级包.所以需要用到zip文件的解压缩功能. 就想着能不能用zlib来完成这个功能.在网上一 ...

  4. python解压版使用_【Python】使用 zipfile 解压含有中文文件名的 zip 文件

    问题 在使用 Python 内置标准库 zipfile 解压文件时,如果压缩文件中有的文件含有中文,那么解压后就会发现文件名中的中文部分是乱码.例如我分别新建三个 txt 文件:文件1.txt,文件2 ...

  5. python解压打开文件过多_自动解压大量压缩文件 Python 脚本 | 学步园

    之前写了一个自动解压压缩文件到压缩文件所在文件夹的脚本 后根据自己需要,写了另外两个.原理一样 都是使用winrar的命令 第一个脚本没考虑周到,只能解压rar文件 改进后可以支持winrar支持的各 ...

  6. python解压打开文件过多_让Python在后台自动解压各种压缩文件!

    一.需求描述 编写一个Python程序,每次下载压缩包形式的文件后,自动将内部文件解压到当前文件夹后将压缩包删除,通过本案例可以学到的知识点: os 模块综合应用 glob 模块综合应用 利用 gzi ...

  7. 7z001怎么解压在安卓手机上面_手机怎么解压zip文件 安卓手机zip文件怎么打开?...

    手机怎么解压zip文件 安卓手机zip文件怎么打开?Zip格式的文件是一种经过压缩的文件,通过压缩之后,文件的体积会变小,从而更有利于在网络上传播.经过压缩的文件,如果想要再次使用,就必须通过解压缩后 ...

  8. mac 命令行 解压7z文件_如何在Mac上快速压缩和解压文件?Mac上解压和压缩文件的方法...

    苹果mac电脑怎么压缩和解压文件?Mac电脑仅默认支持把文件压缩成zip格式,解压成zip.tar.gz,bz2等格式,有些操作需要安装第三方软件来完成,这篇文章为大家带来几种关于在Mac上解压和压缩 ...

  9. 安装软件更新出错提示_博梦软件管家安装解压出错解决办法

    首先说明,我们博梦软件管家发布的软件都是经过测试过的,可以顺利安装并运行.由于系统复杂,每个人的系统版本和权限都不一样,导致部分软件安装出错.今天小编整理了下安装注意事项,大家有问题也可以后台回复我们 ...

最新文章

  1. 多目标跟踪FairMOT笔记
  2. 中国功率半导体产业销售规模与投资策略研究报告2022版
  3. 【测试】SAP选择屏幕界面配图实现
  4. Linux驱动编程 step-by-step (十) Linux 内核链表
  5. AJAX异步原理与实现
  6. jupyter 共享_可共享的Jupyter笔记本!
  7. 女人口口相传的快乐和语气
  8. Cisco ××× 完全配置指南-连载-SSL ×××
  9. 今日份凡尔赛培训满分了没?
  10. linux下jboss分析helloword,JBoss 中运行servlet 的helloworld程序(转)
  11. COJ 1700:联通与次联通
  12. MySQL内核调试_内核调试技巧
  13. android应用程序架构由哪四个组成,android 应用程序结构是哪些
  14. 通过反射获取类的所有属性和方法
  15. vim配置c语言开发环境变量,gcc配置和vim编程
  16. 教你在CentOS 8上安装和配置Redmine项目管理系统
  17. 2019-07-03
  18. Mac上使用exiftool生成XMP文件的方法
  19. django中collectstatic的使用
  20. 平安性格测试题及答案_中国平安EPASS测试题2016年

热门文章

  1. Linux运维 第二阶段 (一)linux基础概念及常用命令
  2. burpsuit--设置代理(抓取APP请求)
  3. CAD转换成JPG图片超级方便的方法
  4. 基于android p的miui,小米8青春版开始适配基于Android P的MIUI10系统,米粉欢呼雀
  5. 明月闯关——丧尸还是僵尸,与只能用金刚符
  6. 一文带你理解深度学习的局限性
  7. Kafka—消息队列
  8. 祝福版的3D标签云动画特效
  9. 3种CSS实现渐变色边框(Gradient borders方法的汇总
  10. 扩散(蓝桥杯真题)——python解答