Qt之使用zlib库解压缩zip文件

首先当然是去官网<A title=http://www.zlib.net/ href="http://www.zlib.net/" _href="http://www.zlib.net/">http://www.zlib.net/下载需要的库文件:

下载一个dll,下载一个source
image

解压缩,

把dll/lib下的zdll.lib放在工程文件夹下,

把dll/include下的zconf.h和zlib.h放入工程文件夹下的include文件夹里

可以在工程目录下再建个zlib文件夹,把source/contrib/minizip下的如下文件都放进来:
image

修改.pro文件(在项目名上右击添加已有文件夹也是同样效果):

SOURCES += main.cpp\         mainwindow.cpp \
    zlib/ioapi.c \
    zlib/iowin32.c \
    zlib/mztools.c \
    zlib/unzip.c \
    zlib/zip.c

HEADERS  += mainwindow.h \
    zlib/crypt.h \
    zlib/ioapi.h \
    zlib/iowin32.h \
    zlib/mztools.h \
    zlib/unzip.h \
    zlib/zip.h \
    readexcelthread.h
 
INCLUDEPATH += $$PWD/include \             $$PWD/zlibDEPENDPATH += $$PWD/include \            $$PWD/zlib

在要使用解压缩功能的类头文件里添加如下几行:

#include "zlib/zip.h"
#include "zlib/unzip.h"
#pragma comment(lib,"zdll.lib")

可以做个函数进行解压缩:

//unZip zip file to zipFilePath

bool Report::unZip(QString zipFileFullName,QString zipFilePath)
{
    qDebug()<<"zipFileFullName:"+zipFileFullName;
    qDebug()<<"zipFilePath:"+zipFilePath;
    if(!QFile::exists(zipFileFullName)){
        qDebug()<<"zip file not exist.";
    }
    unz_file_info64 FileInfo;
    unzFile zFile = unzOpen64(zipFileFullName.toStdString().c_str());
    if(NULL == zFile){
        qDebug() << "UnzOpen64 failed!";
        return false;
    }

    unz_global_info64 gi;
    if (unzGetGlobalInfo64(zFile, &gi) != UNZ_OK)
    {
        qDebug() << "unzGetGlobalInfo64 failed!";
        return false;
    }

    int result;
    for (int i = 0; i < gi.number_entry; ++i)
    {
        char file[256] = {0};
        char ext[256] = {0};

        char com[1024] = {0};
        if (unzGetCurrentFileInfo64(zFile, &FileInfo,file,sizeof(file),ext,256,com,1024)!= UNZ_OK){
            qDebug() << "unzGetCurrentFileInfo64 failed.";
            return false;
        }

        qDebug() << file << ":" << ext << ":" << com;

        if(!(FileInfo.external_fa & FILE_ATTRIBUTE_DIRECTORY)) //文件,否则为目录

        //打开文件
        result=unzOpenCurrentFile(zFile);/* 无密码 */
        result=unzOpenCurrentFilePassword(zFile,"szPassword"); /* 有密码 */
        char data[1024] = {0};
        int size;
        //读取内容
        QString path = QString(zipFilePath) +"/"+taskName+"_GeneralFEAPost/";
        QDir unZipPath;
        if(!unZipPath.exists(path)){
            unZipPath.mkpath(path);
        }
        QString decompressFullPath=path+file;
        qDebug()<<"zip decompress path:"+path;
        QFile f(decompressFullPath);
        f.open(QFile::WriteOnly);
        while(true) {
            size= unzReadCurrentFile(zFile,data,sizeof(data));
            if(size <= 0)
                break;

            f.write(data, size);
        }
        f.close();

        //关闭当前文件
        unzCloseCurrentFile(zFile);
        if(i < gi.number_entry - 1 && unzGoToNextFile(zFile) != UNZ_OK){
            qDebug() << "unzGoToNextFile failed.";
            return false;
        }

    }
    unzClose(zFile);
    return true;
}

以上即可完成对zip文件的解压缩~具体细节通过代码可以看出来。

你可能感兴趣的:(Qt之使用zlib库解压缩zip文件)