Qt基于QuaZIP实现文件压缩/解压(Linux下)
如有需要,欢迎查看文章。
QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库。适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开。
Qt中提供了qCompress/qUncompress来进行文件的压缩与解压,但存在两个问题:
-
无法很好地压缩/解压缩文件夹。 只能将一个文件压缩为某种格式,压缩后的文件无法通过其它解压工具打开(如:7zip,或WinRAR),只能通过qUncompress解压读取,也就是说qCompress生成的压缩文件不包含普通压缩文件的一些头信息,导致无法解压。
一、工具准备
-
gcc Qt Creator Linux版
由于QuaZIP是基于zlib实现的,故需要先编译出zlib库,以供QuaZIP编译链接。
二、编译zlib
1、下载zlib源码
进入,下载zlib源码包。
2、配置
解压源码
unzip zlib1211.zip
进入源码目录
cd zlib-1.2.11
配置编译器
export CC=gcc
配置安装路径
./configure --prefix=../x86
安装目录设定为上一级的x86目录下。
3、编译与安装
编译
make
安装
make install
安装到x86目录后,该目录下有相应头文件和库文件,如下所示:
三、编译QuaZIP
1、下载QuaZIP源码
进入,下载源码包。
提示:
本版本为旧版0.7.3。最新版为1.1,地址变更到了:,且编译方法也发生了变化,以下编译方法对新版本无效。
2、将zlib库和头文件加入QuaZIP工程
解压该源码,然后
-
拷贝zlib的头文件zconf.h、zlib.h至quazip-0.7.3/quazip/zlib/include下; 拷贝libz.so、libz.so.1、libz.so.1.2.11至quazip-0.7.3/quazip/zlib/lib下。
如下:
在quazip-0.7.3/quazip/quazip.pro文件中,unix下添加:
INCLUDEPATH += $$PWD/zlib/include LIBS += -L$$PWD/zlib/lib -lz
如下:
3、使用Qt Creator进行编译
使用Qt Creator打开quazip-0.7.3/quazip.pro文件,并编译quazip库工程。
最后生成libquazip.so.1.0.0动态库,以及libquazip.so、libquazip.so.1、libquazip.so.1.0三个软链接。
四、调用QuaZIP实现压缩/解压
我们建立一个Qt测试工程quazipTest,用于调用QuaZIP库。
首先,所需头文件和库,有QuaZIP和zlib两部分:
-
拷贝quazip-0.7.3/quazip下所有头文件,和zlib的zlib.h、zconf.h,至quazipTest/quazip/include; 拷贝zlib的库libz.so、libz.so.1、libz.so.1.2.11,quazip的库libquazip.so、libquazip.so.1、libquazip.so.1.0、libquazip.so.1.0.0至quazipTest/quazip/lib/linux。
如下:
然后,在quazipTest.pro文件中,添加如下内容:
unix { INCLUDEPATH += $$PWD/quazip/include LIBS += -L$$PWD/quazip/lib/linux -lquazip }
测试代码:
#include <QCoreApplication> #include "JlCompress.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 将程序当前目录进行压缩,压缩文件为myTest.zip JlCompress::compressDir("D:/myTest.zip", "./"); // 将myTest.zip解压到D:/myTest目录下 JlCompress::extractDir("D:/myTest.zip", "D:/myTest"); return a.exec(); }
运行时,依赖zlib的库libz.so、libz.so.1、libz.so.1.2.11,quazip的库libquazip.so、libquazip.so.1、libquazip.so.1.0、libquazip.so.1.0.0。
执行结果如下:
在JlCompress.h中,封装了很多方法,支持对单文件、多文件、目录等进行压缩,可以根据实际选择使用。
本文涉及工程代码: