天天看點

Qt中利用Zlib和QuaZIP庫解壓zip檔案

前言

最近寫公司的貨架産品,在總結之前項目裡用到的代碼。立個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配置

  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

繼續閱讀