1. 程式人生 > >Qt實現zip壓縮和解壓,編譯、呼叫zlib和QuaZip動態庫過程詳解

Qt實現zip壓縮和解壓,編譯、呼叫zlib和QuaZip動態庫過程詳解

http://blog.csdn.net/qq_37354286/article/details/78858788

之前有個小專案中需要對zip壓縮檔案進行壓縮和解壓操作,需要用到zlib庫,使用Qt開發的話可以用到已經封裝好的QuaZip。作為一枚新人程式設計師應有的習慣,我將整個過程整理成了這篇文章,有不妥的地方還希望看到的朋友能夠指出,謝謝!

開發環境

作業系統:Windows 7 x64
Qt版本:Qt 4.8.4
編譯器:MSVC2010
zlib版本:zlib-1.2.11
QuaZip版本:QuaZip-0.7.3

這裡介紹的過程中,x64和x86根據實際環境而定。

原始碼下載

編譯zlib

開啟VS2010命令提示。

這裡寫圖片描述

進入到zlib原始碼目錄contrib/masmx86目錄下,執行bld_ml32.bat。

這裡寫圖片描述

在zlib原始碼中進入contrib/vstudio/vc10目錄下,用VS2010開啟zlibvc.sln檔案。

這裡寫圖片描述

將配置修改為Release,Win32。

這裡寫圖片描述

右鍵zlibvc進行生成。

這裡寫圖片描述

這裡寫圖片描述

這個時候我們可以看到vc10目錄下有個x86目錄,裡面有個ZlibDllRelease。

這裡寫圖片描述

編譯QuaZip

開啟QuaZip原始碼目錄下,進入到quazip目錄中。

這裡寫圖片描述

在quazip目錄下建立一個lib資料夾,並將剛才編譯zlib時生成的ZlibDllRelease拷貝到該目錄下。

在quazip目錄下建立一個include資料夾,將zlib原始碼中的zconf.h和zlib.h拷貝到該目錄下。

然後回到QuaZip原始碼目錄下,用QtCreator開啟quazip.pro。

這裡寫圖片描述

編輯quazip.pro,刪掉qztest和qztest.depends = quazip一行。

這裡寫圖片描述

在quazip下的quazip.pro中的win32中新增INCLUDEPATH包含標頭檔案和LIBS連結zlib庫,也就是剛才新建的lib目錄和include目錄。

win32 {
    headers.path=$$PREFIX/include/quazip
    headers.files=$$HEADERS
    target.path=$$PREFIX/lib
    INSTALLS += headers target
    # workaround for qdatetime.h macro bug
DEFINES += NOMINMAX INCLUDEPATH += $$PWD/include LIBS += -L$$PWD/lib/ZlibDllRelease -lzlibwapi }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用Qt編譯quazip,編譯一個Debug版本,編譯一個Release版本。

在構建目錄中,找到生成的quazip動態庫,Debug版本為quazipd.dll,Release版本為quazip.dll。

新建一個QuaZip目錄,在該目錄下新建一個lib/debug和lib/release資料夾,將quazipd.dll、quazipd.lib和quazip.dll、quazip.lib分別拷貝到debug和release目錄下。

這裡寫圖片描述這裡寫圖片描述

在新建的QuaZip目錄下,新建一個include目錄,將quazip.pro中的所有標頭檔案以及zlib.h和zconf.h拷貝到include目錄下。

這裡寫圖片描述

QuaZip就算是編譯好了。

呼叫QuaZip

QuaZip中封裝了兩個介面,一個解壓,一個壓縮。

// 壓縮
JlCompress::compressFile(QString fileCompressed, QString file);
JlCompress::compressFiles(QString fileCompressed, QStringList files);
JlCompress::compressDir(QString fileCompressed, QString dir);

// 解壓
JlCompress::extractFile(QString fileCompressed, QString fileName);
JlCompress::extractFiles(QString fileCompressed, QStringList files);
JlCompress::extractDir(QString fileCompressed, QString dir);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

新建一個工程QuaZipTest,將剛才編譯好的QuaZip目錄拷貝到QuaZipTest源目錄下。

這裡寫圖片描述

新增INCLUDEPATH標頭檔案和LIBS連結庫(Debug版本用quazipd.dll,Release版本用quazip.dll)。

#debug

INCLUDEPATH += $$PWD/QuaZip/include
LIBS += -L$$PWD/QuaZip/lib/debug -lquazipd
  • 1
  • 2
  • 3
  • 4
#release

INCLUDEPATH += $$PWD/QuaZip/include
LIBS += -L$$PWD/QuaZip/lib/release -lquazip
  • 1
  • 2
  • 3
  • 4

包含標頭檔案。

#include <JlCompress.h>
  • 1

簡單的測試程式碼。

#include <QApplication>
#include <JlCompress.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    JlCompress::compressDir("E:/a.zip", "E:/a");
    JlCompress::extractDir("E:/a.zip", "E:/b");

    return a.exec();
}