简介

QuaZip是使用QT/C++对ZLIB进行封装,且用于压缩及解压缩ZIP的开源库,今天就来介绍如何在Win下使用该开源库。

Qt中是提供了qCompress/qUncompress来进行文件的压缩和解压,但是存在很大的缺点,只能解压Qt压缩的文件,其他的格式或者手动压缩的文件,无法解压。

一、编译zlib源码

下载zlib源码:官方下载地址

qt qcompress 压缩文件夹 qt 解压缩_Qt

qt qcompress 压缩文件夹 qt 解压缩_#include_02

 

qt qcompress 压缩文件夹 qt 解压缩_#include_03

zlib1211.zip在编译的时候出现了一些错误,为了节约时间建议下载zlib128.zip,另外如果你不想编译zlib源码,可以直接下载zlib128-dll.zip,解压后的dll文件是可以直接使用的,那么接下来我们就开始编译源码吧。先打开VS的开发人员命令提示符窗口,然后进入到\zlib128\zlib-1.2.8\contrib\masmx86目录下,执行脚本bld_ml32.bat

qt qcompress 压缩文件夹 qt 解压缩_qt qcompress 压缩文件夹_04

qt qcompress 压缩文件夹 qt 解压缩_动态库_05

最终会生成inffas32.obj和match686.obj

qt qcompress 压缩文件夹 qt 解压缩_#include_06

最后回到zlib的根目录下,执行nmake命令,编译动态库

nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="contrib/masmx86/inffas32.obj contrib/masmx86/match686.obj"

qt qcompress 压缩文件夹 qt 解压缩_Qt_07

编译成功后会生成动态库文件zlib1.dll

qt qcompress 压缩文件夹 qt 解压缩_qt qcompress 压缩文件夹_08

以上是32位动态库的编译,如果你想编译64位的动态库,可以进入到\zlib128\zlib-1.2.8\contrib\masmx64目录下,执行脚本bld_ml64.bat,接下来的编译步骤按照以上的方式就可以了。

二、编译QuaZip

下载QuaZip源码:官方下载地址

解压该源码后,在quazip中创建include和lib文件夹

qt qcompress 压缩文件夹 qt 解压缩_qt qcompress 压缩文件夹_09

然后将zlib中的zconf.h和zlib.h头文件拷贝到include中,再把zlib编译好的动态库文件zlib1.dll文件拷贝到lib中。再打开quazip的工程,进入到quazip.pro工程文件中,

添加头文件路径和动态库路径

qt qcompress 压缩文件夹 qt 解压缩_qt qcompress 压缩文件夹_10

最后编译quazip工程,会生成一个动态库文件,Debug(quazipd.dll)和Release(quazipd.dll)模式编译得到的文件名称不一样,用哪一个可以自行选择。走到这一步上,编译动态库的工作就已经完成了。

三、创建测试案例

我们需要用到上述编译生成的动态库文件以及头文件,所以同理需要在测试工程中创建include和lib文件夹

qt qcompress 压缩文件夹 qt 解压缩_动态库_11

将zlib中的zconf.h和zlib.h头文件拷贝到include中,然后再从quazip拷贝所有头文件。

qt qcompress 压缩文件夹 qt 解压缩_Qt_12

最后修改测试工程文件,添加头文件路径和动态库路径

INCLUDEPATH += $$PWD/include
 
CONFIG(debug, debug|release) {
    LIBS += -L$$PWD/lib -lquazipd
} else {
    LIBS += -L$$PWD/lib -lquazip
}

测试代码如下:

#include <QDebug>
#include "JlCompress.h"
#include <QDir>
#include <QProcess>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //压缩文件
    bool ret = JlCompress::compressFile("Qt.zip", "Qt.pdf");
    if (!ret) {
        qDebug() << "文件压缩失败...";
    }

    //解压文件
    QStringList list = JlCompress::extractDir("Test_File.zip", QDir::currentPath());
    if (list.length() <= 0) {
        qDebug() << "文件解压失败...";
        return;
    }
    qDebug() << "list:" << list;

}