参考
https://www.cnblogs.com/lvdongjie/p/7345545.html
https://github.com/Zalafina/Q7Zip
(假如考虑到跨平台的问题的话,只能使用QuaZip或者通过QProcess调用7zip)
有个项目需求对某个文件进行打包压缩,上传给服务器,然后服务器解压对文件执行一定的操作。因此需要解压缩文件。
经过查找,发现有个QuaZip的第三方的库,据说挺好用,试一下。
还是建议大家直接将源码加到自己项目,直接编译吧。不然有坑。
源码加到项目时,需要在pro文件添加
DEFINES += QUAZIP_STATIC
1.到这里下载源码。
2.解压,然后在文件夹里面新建个build文件夹
3.打开cmake。设置好源码路径、编译路径。
4.选择适合你的编译套件。这里我选vs2017 x64
5.然后需要设置Qt路径。
6.设置好Qt路径以及quaZip的路径后,继续点击config。
7.再点击generate,就OK了。build中生成了vs的工程文件。
8.打开,并选择release,x64;生成解决方案
9.右键INSTALL子项目,选择 仅用于项目–》仅生成INSTALL。
10.完成。此时你之前在cmake设置的安装目录下面就有了库了。
使用的话,就像使用其他第三方库那样子了:在pro文件中包含头文件路径、库文件,然后include头文件。。。
或者参照这个
#include "JlCompress.h"
int main(int argc, char **argv)
{
QApplication app(argc,argv);
...
// 压缩文件夹
JlCompress::compressDir("F:\\QuaZip.zip", "F:\\QuaZip");
// 解压缩文件夹
JlCompress::extractDir("F:\\QuaZip.zip", "F:\\ExtractQuaZip");
QuaZip archive("F:\\QuaZip.zip");
if (!archive.open(QuaZip::mdUnzip)) {
return;
}
QString dstDir = "F:\\ExtractQuaZip";
QDir dir;
if(dir.exists(dstDir) == false)
{
dir.mkpath(dstDir);
}
dir = QDir(dstDir);
for (bool f = archive.goToFirstFile(); f; f = archive.goToNextFile())
{
QString filePath = archive.getCurrentFileName();
qDebug() << filePath;
if (filePath.endsWith("/"))
{
dir.mkpath(filePath);
}
else
{
QuaZipFile zFile(archive.getZipName(), filePath);
zFile.open(QIODevice::ReadOnly);
QByteArray ba = zFile.readAll();
zFile.close();
QFileInfo fileInfo(filePath);
QString mPath = fileInfo.path();
if(dir.exists(mPath) == false)
{
dir.mkpath(mPath);
}
QFile dstFile(dstDir + "/"+ filePath);
if (!dstFile.open(QIODevice::WriteOnly))
return;
dstFile.write(ba);
dstFile.close();
}
}
...
用的时候会报这个错,
error: C1083: 无法打开包括文件: “zlib.h”: No such file or directory
因此需要将其zlib头文件路径加进来
...
INCLUDEPATH += D:\Qt\QuaZip\include\QuaZip-Qt5-1.1\quazip
LIBS += D:\Qt\QuaZip\lib\quazip1-qt5.lib
INCLUDEPATH += D:\Qt\Qt5.12.9\5.12.9\msvc2017_64\include\QtZlib
...
此外还要将dll文件拷贝过去项目的release文件夹下:
但是上面的QuaZip库只能一次性压缩、解压文件文件夹,没有进度条,不是很好。于是找了个貌似更加方便的方法,调用7zip
https://github.com/Zalafina/Q7Zip
下载源码之后,打开,可能会出现
无法解析的外部符号的错误
解决办法是在pro文件中添加合适的库文件:OleAut32.Lib、User32.Lib
...
LIBS += $$quote(C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64\OleAut32.Lib)
LIBS += $$quote(C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64\User32.Lib)
...
还有个bit7zip,感觉也挺适合的。
https://github.com/rikyoz/bit7z
https://codechina.csdn.net/mirrors/rikyoz/Bit7z?utm_source=csdn_github_accelerator
https://blog.csdn.net/llmys/article/details/87893606