Qt中利用Zlib和QuaZIP库解压zip文件

2 篇文章 0 订阅
1 篇文章 0 订阅

前言

最近写公司的货架产品,在总结之前项目里用到的代码。立个flag,这几天会把之前做的解压缩部分的代码整合到博客中。
zip文件解压部分,是我踩坑最严重的部分。当时编译Zlib库,QuaZip库花了很长时间。所以这部分我整理的还比较详细,希望以后不会再在这部分浪费时间。
【尤其感谢参考文献里的那位大佬的分享!~】

项目需求
  • 解压.zip压缩文件
  • 需要每个文件的解压结果
  • 最好能不解压能看到.zip文件内部信息
开发环境
  • Qt : 5.9.6
  • 编译器 : MinGW 5.3.0 32bit

准备工作

库下载
Zlib配置
  1. 解压下载的zlib1211.zip文件至自定义目录:D:\3rdParty\zlib\zlib-1.2.11-quazip;
  2. 打开命令行,定位到自定义目录:D:\3rdParty\zlib\zlib-1.2.11-quazip后,执行以下命令;
mingw32-make -f win32/Makefile.gcc
QuaZip配置
  1. 解压下载的quazip-0.7.3.zip文件至自定义目录:D:\3rdParty\QuaZIP\quazip-0.7.3;
  2. 打开命令行,定位到自定义目录:D:\3rdParty\QuaZIP\quazip-0.7.3;
  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); 

代码示例

  1. 将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
  1. 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();
}

可能的问题

  1. 如果qmake,mingw32-make命令不能使用,那就需要配置环境变量。
  • qmake.exe : Qt安装目录下的5.9.6\mingw53_32\bin
  • mingw32-make.exe : Qt安装目录下的Tools\mingw530_32\bin
    或者cd到以上目录执行对应命令。

参考文献

  1. Zipping and unzipping files with Qt
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值