本文是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();
}