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

场景:

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文件。

#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 buffer

string ZipUtil::ReadZipFile(string zipFile, string fileInZip) {
    int err = UNZ_OK;                 // error status
    uInt size_buf = WRITEBUFFERSIZE;  // byte size of buffer to store raw csv data
    void* buf;                        // the buffer
    string sout;                      // output strings
    char filename_inzip[256];         // for unzGetCurrentFileInfo
    unz_file_info file_info;          // for unzGetCurrentFileInfo

    unzFile uf = unzOpen(zipFile.c_str()); // open zipfile stream
    if (uf==NULL) {
        cerr << "Cannot open " << zipFile << endl;
        return sout;
    } // file is open

    if ( unzLocateFile(uf,fileInZip.c_str(),1) ) { // try to locate file inside zip
        // second argument of unzLocateFile: 1 = case sensitive, 0 = case-insensitive
        cerr << "File " << fileInZip << " not found in " << zipFile << endl;
        return sout;
    } // file inside zip found

    if (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 zip

    buf = (void*)malloc(size_buf); // setup buffer
    if (buf==NULL) {
        cerr << "Error allocating memory for read buffer" << endl;
        return sout;
    } // buffer ready

    err = 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 buffer
    cout << "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 string
            break;
        }
        // copy the buffer to a string
        if (err>0) for (int i = 0; i < (int) err; i++) sout.push_back( *(((char*)buf)+i) );
    } while (err>0);

    err = unzCloseCurrentFile (uf);  // close the zipfile
    if (err!=UNZ_OK) {
        cerr << "Error " << err << " with zipfile " << zipFile << " in unzCloseCurrentFile" << endl;
        sout = ""; // empty output string
    }

    free(buf); // free up buffer memory
    return sout;
}
时间: 2024-10-03 21:41:33

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

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

场景: 1. 解压文件一般用在下载了一个zip文件之后解压,或者分析某个文件需要解压的操作上. 2. 解压文件,特别是解压带文件夹的zip文件往往系统没有提供这类Win32 API,当然C#自带库能解压, 当然这里只讨论C/C++, 像C#和Java这种开挂的标准库不在考虑范围内. 3. zlib解压文件的使用例子在 contrib\minizip 例子里. 这里基本是直接提取miniunz.c 的代码进行封装解压即可, 只是改了下支持中文路径. 主文件 zip_util.cpp #includ

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 http://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipAr

android zip4j之--解压zip文件并实时显示解压进度

Zip文件是我们经常用到压缩文件格式,android中在进行网络请求大批量数据时,通常会采用传递zip文件,这样做即可以减少网络流量的消耗,加快请求的响应速度,又可以减少对存储空间的要求,所以当我们将zip文件读取回来的时候,如何解压就是一个要解决的问题,虽然java本身提供了zip相关的API,但不是很强大,所以我们采用apache开源组织的zip4j,通过这个jar包可以十分轻松的解压zip文件. 回到项目中去,项目中有个需求是从服务器请求杂志,请求回来后给读者展示,但是由于公司自己做的电子

通过javascript在网页端解压zip文件并查看压缩包内容

WEB前端解压ZIP压缩包 web前端解压zip文件有什么用: 只考虑标准浏览器的话, 服务器只要传输压缩包到客户端, 节约了带宽, 而且节约了传输时间, 听起来好像很厉害的说:     如果前端的代码很多, 而且包含大副的图片,那么就可以把js和css和jpg和png等各种数据通过服务端打包成zip传送到浏览器, 浏览器负责解压, css实用动态生成插入到dom中,js也用globalEval直接执行, jpg或者png各种图片文件由blob流转化为image, 直接插入到浏览器中: html

JAVA解压ZIP文件

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import

[Linux] 解压tar.gz文件,解压部分文件

遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: http://www.cnblogs.com/garinzhang/archive/2013/04/23/3037147.html 使用tar –zxvf *.tar.gz无法解压,明明好好的tar.gz文件能这样解压的,为什么不能解压?   后来想了想,是不是先要解压*.gz文件,使用gunzip

ubuntu解压zip文件中文乱码问题

通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip 注:xxx.zip为需要解压的文件名 ubuntu解压zip文件中文乱码问题

saltstack在解压zip文件时保留原始修改时间的方法

saltstack在使用archive.unzip功能时,会将压缩包中文件的"修改时间"替换为当前解压的系统时间,为了能够保留文件原来的"修改时间",需要对salt-manion的源码中archive.py文件的unzip方法进行修改: 文件位置: windows    C:/salt/bin/Lib/site-packages/salt/modules/archive.py linux:  /user/lib/python2.7/site-packages/sal

解压bzi2文件出错,分析和处理

在使用tar 解压bz2文件时报错 tar jxf x.tar.bz2 tar (child): bzip2: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now 对于习惯了伸手就来的我来说,想都没想直接复制报错网上开始搜了起来