之前有個小項目中需要對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源碼下載地址:http://www.zlib.net/
QuaZip源碼下載地址:http://quazip.sourceforge.net/
編譯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
}
使用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);
新建一個工程QuaZipTest,將剛纔編譯好的QuaZip目錄拷貝到QuaZipTest源目錄下。
添加INCLUDEPATH頭文件和LIBS鏈接庫(Debug版本用quazipd.dll,Release版本用quazip.dll)。
#debug
INCLUDEPATH += $$PWD/QuaZip/include
LIBS += -L$$PWD/QuaZip/lib/debug -lquazipd
#release
INCLUDEPATH += $$PWD/QuaZip/include
LIBS += -L$$PWD/QuaZip/lib/release -lquazip
包含頭文件。
#include <JlCompress.h>
簡單的測試代碼。
#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();
}