前言
最近写公司的货架产品,在总结之前项目里用到的代码。立个flag,这几天会把之前做的解压缩部分的代码整合到博客中。
zip文件解压部分,是我踩坑最严重的部分。当时编译Zlib库,QuaZip库花了很长时间。所以这部分我整理的还比较详细,希望以后不会再在这部分浪费时间。
【尤其感谢参考文献里的那位大佬的分享!~】
项目需求
- 解压.zip压缩文件
- 需要每个文件的解压结果
- 最好能不解压能看到.zip文件内部信息
开发环境
- Qt : 5.9.6
- 编译器 : MinGW 5.3.0 32bit
准备工作
库下载
- zlib-1.2.11 : http://zlib.net/
- quazip-0.7.3 : https://sourceforge.net/projects/quazip/
Zlib配置
- 解压下载的
zlib1211.zip
文件至自定义目录:
D:\3rdParty\zlib\zlib-1.2.11-quazip; - 打开命令行,定位到
自定义目录:
D:\3rdParty\zlib\zlib-1.2.11-quazip后,执行以下命令;
mingw32-make -f win32/Makefile.gcc
QuaZip配置
- 解压下载的
quazip-0.7.3.zip
文件至自定义目录:
D:\3rdParty\QuaZIP\quazip-0.7.3; - 打开命令行,定位到
自定义目录:
D:\3rdParty\QuaZIP\quazip-0.7.3; - 分条执行以下命令;
qmake "CONFIG+=release" "INCLUDEPATH+=D:/3rdParty/zlib/zlib-1.2.11-quazip" "LIBS+=-LD:/3rdParty/zlib/zlib-1.2.11-quazip -lz"
mingw32-make
qmake "CONFIG+=debug" "INCLUDEPATH+=D:/3rdParty/zlib/zlib-1.2.11-quazip" "LIBS+=-LD:/3rdParty/zlib/zlib-1.2.11-quazip -lz"
mingw32-make
以上步骤没报错就可以继续下一步。
JlCompress类公有成员函数
压缩部分
/**
* @brief 压缩单个文件
* @param fileCompressed: 压缩包的名称 file: 要压缩的文件
* @return 压缩成功返回true否则为false
*/
static bool compressFile(QString fileCompressed, QString file);
/**
* @brief 压缩多个文件(文件列表)
* @param fileCompressed: 压缩包的名称 files: 要压缩的文件列表
* @return 压缩成功返回true否则为false
*/
static bool compressFiles(QString fileCompressed, QStringList files);
/**
* @brief 压缩一个文件夹(不会压缩文件夹内的隐藏文件)
* @param fileCompressed: 压缩包的名称 dir: 要压缩的文件夹目录 recursive:是否要打包子文件目录
* @return 压缩成功返回true否则为false
*/
static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);
/**
* @brief 压缩一个文件夹(通过设置filters参数可以压缩文件夹内隐藏文件)
* @param fileCompressed: 压缩包的名称 dir: 要压缩的文件夹目录 recursive:是否要打包子文件目录 filters:过滤条件
* @return 压缩成功返回true否则为false
*/
static bool compressDir(QString fileCompressed, QString dir,
bool recursive, QDir::Filters filters);
解压部分
/**
@ brief 解压单个文件
@ param fileCompressed: 压缩包的地址 fileName:要解压的文件(压缩包内)的文件名 fileDest:存放文件的目录(需要包含文件名fileName)
@ return 解压的文件的完整路径列表,失败时为空。
*/
static QString extractFile(QString fileCompressed, QString fileName, QString fileDest = QString());
/**
@ brief 解压多个文件(文件列表)
@ param fileCompressed:压缩包的地址 files:要解压的文件(压缩包内)的文件列表 dir:存放文件的目录
@ return 解压的文件的完整路径列表,失败时为空。
*/
static QStringList extractFiles(QString fileCompressed, QStringList files, QString dir = QString());
/**
@ brief 解压整个压缩包
@ param fileCompressed:压缩包的地址 dir:存放文件的目录
@ return 解压的文件的完整路径列表,失败时为空。
*/
static QStringList extractDir(QString fileCompressed, QString dir = QString());
/**
@ brief 获取压缩包内文件列表
@ param fileCompressed:压缩包的地址
@ return 文件中的文件列表,更准确地说,是列出条目,包括文件和目录单独存在
*/
static QStringList getFileList(QString fileCompressed);
//4个重载函数
//param ioDevice pointer to device with compressed data.
static QString extractFile(QIODevice *ioDevice, QString fileName, QString fileDest = QString());
static QStringList extractFiles(QIODevice *ioDevice, QStringList files, QString dir = QString());
static QStringList extractDir(QIODevice *ioDevice, QString dir = QString());
static QStringList getFileList(QIODevice *ioDevice);
代码示例
- 将zlib、quazip库链接进项目pro文件
#路径需要换成自己配置的路径
INCLUDEPATH += D:/3rdParty/zlib/zlib-1.2.11-quazip
LIBS += -LD:/3rdParty/zlib/zlib-1.2.11-quazip -lz
INCLUDEPATH += D:/3rdParty/QuaZIP/quazip-0.7.3/quazip
LIBS += -LD:/3rdParty/QuaZIP/quazip-0.7.3/quazip/release -lquazip
- main.cpp
#include <QCoreApplication>
#include <JlCompress.h>
#include <QDebug>
int main(int argc, char * argv[])
{
QCoreApplication a(argc, argv);
//压缩部分
//----1
JlCompress::compressFile("D:/test/test1.zip", "D:/test/test1-1.txt");
//----2
QStringList compress_filelist;
compress_filelist.append("D:/test/test2-1.txt");
compress_filelist.append("D:/test/test2-2.txt");
compress_filelist.append("D:/test/test2-3.log");
JlCompress::compressFiles("D:/test/test2.zip", compress_filelist);
//----3
JlCompress::compressDir("D:/test/test3.zip", "D:/test/inputFolder", true);
//----4
JlCompress::compressDir("D:/test/test4.zip", "D:/test/inputFolder", true, QDir::Hidden);
//解压部分
//----1
JlCompress::extractFile("D:/test/test_quazip.zip", QString("3.txt"), "D:/test/extractTest/1/3.txt");
//----2
QStringList extract_filelist;
extract_filelist.append("1.txt");
extract_filelist.append("2.txt");
JlCompress::extractFiles("D:/test/test_quazip.zip", extract_filelist, "D:/test/extractTest/2");
//----3
JlCompress::extractDir("D:/test/test_quazip.zip", "D:/test/outputFolder");
//----4
QStringList testlist = JlCompress::getFileList("D:/test/test_quazip.zip");
for(int i = 0, size = testlist.size(); i < size; i++)
{
qDebug() << testlist.at(i) << endl;
}
return a.exec();
}
可能的问题
- 如果
qmake
,mingw32-make
命令不能使用,那就需要配置环境变量。
- qmake.exe : Qt安装目录下的5.9.6\mingw53_32\bin
- mingw32-make.exe : Qt安装目录下的Tools\mingw530_32\bin
或者cd
到以上目录执行对应命令。