Qt压缩解压缩zip文件,解压缩加密zip文件

本文是windows系统,MinGW64位环境,MSVC编译环境下在quazipd和libz库的编译过程有所不同。
本文用的下载文件和工程文件做了个压缩包:
https://download.csdn.net/download/weixin_40355471/18231263

编译libz.a库

第一步,搭建MSYS环境
下载地址:https://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/
解压缩在C盘,这里是模拟linux系统环境,解压缩后运行 msys.bat 就可以加载msys,并且把qt的mgw安装目录加入到系统环境变量:C:\Qt\Qt5.12.2\Tools\mingw730_64\bin
第二步,下载zlib-1.2.11.zip,下载地址:http://www.zlib.net/
第三步,把zlib-1.2.11.zip解压缩到刚安装的msys里面用户的家目录:C:\msys\home\user
第四步,编译zlib库
运行msys.bat,在命令行执行依次下面指令

cp win32/makefile.gcc makefile.gcc	#cd到zlib-1.2.11目录下执行
make -f makefile.gcc
make install -f Makefile.gcc INCLUDE_PATH=/mingw/include/ LIBRARY_PATH=/mingw/lib/ BINARY_PATH=/mingw/bin/	#生成的库放在C:\msys\mingw目录下

至此,生成了include文件夹里面是头文件,lib文件夹里面是libz.a。

编译quazipd.dll

根据生成的libz.a,编译quazipd.dll库
下载quazip:https://github.com/stachenov/quazip
这里下载的是源码文件,没有QT工程pro文件,需要自己配置,本文开头的下载链接内有配置好的工程,可以直接编译。
把生成的libz.a里面include和lib文件夹拷贝到quazip文件夹下,pro文件引用libz头文件和库文件,这里注意引用.a库文件时把lib和后面的.a去掉,只保留库名称,即:z

    INCLUDEPATH += $$PWD/include
    LIBS += -L $$PWD/lib -lz

编译成功后即可生成quazipd.dll库文件。
补充一点,debug模式下生成的dll库自动加后缀d,这样release模式下生成的库名称是quazip.dll,debug模式下生成的库名称是quazipd.dll。

CONFIG(debug, debug|release) {
     mac: TARGET = $$join(TARGET,,,_debug) 
     win32: TARGET = $$join(TARGET,,,d)
}

压缩和解压缩zip

把quazipd里面的头文件全部拷贝到include文件夹下,把include文件夹和lib文件夹拷贝到测试工程目录,测试工程pro文件添加:

INCLUDEPATH += $$PWD/include

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

另外需要把quazipd.dll拷贝到构建目录,即可执行文件exe所在目录,否则运行时会崩溃。

quazipd支持的压缩和解压缩方式很多,这里只介绍两种:
第一种,直接压缩和解压缩JlCompress

    JlCompress::compressDir("D:/test/quazip-master.zip", "D:/test/quazip-master");//参数1:压缩后的文件,参数2:待压缩的目录,参数3:是否递归
    JlCompress::extractDir("D:/test/3.zip", "D:/test/");//参数1待解压缩的文件,参数2解压缩存放的目录

第二种,QuaZipFile解压缩,支持解压加密zip文件

void MainWindow::UnZipFile()
{
    QuaZipFile file4("D:/test/3.zip");//zip文件目录
    file4.open(QIODevice::ReadOnly,"123456");//第二个参数是zip密码

    QFile file2("D:/test/3.mp4");//解压后的文件名
    if (!file2.open(QIODevice::WriteOnly ))
        return;

    char fileData[2048]={0};

    int size=file4.csize()-2048;
    while(!file4.atEnd())
    {
        if(file4.getZipError() != 0)//getZipError返回非0值,表示文件错误,密码错误时返回-3
        {
            file2.remove();
            break;
        }
        file4.read(fileData,2048);
        file2.write(fileData,2048);
        size=size-2048;
    }
    file2.close();
    file4.close();
}

版权声明:本文为weixin_40355471原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。