Qt中用QuaZip來壓縮和解壓縮文件
一、簡介
QuaZIP是使用Qt,C++對ZLIB進行簡單封裝的用於壓縮ZIP以及解壓縮ZIP的開源庫。如果你的Qt項目當中用到了壓縮以及解壓縮ZIP的話你可以考慮選擇使用它。
官方主頁:http://quazip.sourceforge.net/
souceforge下載地址:http://sourceforge.net/projects/quazip/
Qt的c++ zlib(zlib.h,zconf.h)中提供了qCompress/qUncompress來進行文件的壓縮與解壓,但存在兩個問題:
1、無法很好地壓縮/解壓縮文件夾。
2、只能將一個文件壓縮為某種格式,壓縮后的文件無法通過其它解壓工具打開(如:7zip,或WinRAR),只能通過qUncompress解壓讀取,也就是說qCompress生成的壓縮文件不包含普通壓縮文件的一些頭信息,導致無法解壓。
二、下載解壓quazip源程序,通過qt打開編譯程序
1、打開quazip下的quazip.pro項目,在quazip.pro中修改,將SUBDIRS=quazip qztest前添加#注釋該句,添加SUBDIRS=quazip 。意思是注釋掉測試程序qztest項目的編譯;
2、修改第二級quazip目錄下的quazip.pro文件,因quazip是基於zlib庫的需要在quazip.pro中引入zlib庫路徑,qt中自帶了zlib庫,路徑在Qt安裝目錄下/5.15.1/Src/qtbase/src/3rdparty/zlib/src或者可以通過環境變量引用。
添加如下語句:
INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtZlib
或者INCLUDEPATH+=C:/Qt/5.15.1/Src/qtbase/src/3rdparty/zlib/src
三、在window環境下可以編譯位下面幾類庫,對應實際項目引用相應庫:
Mingw32
Mingw64
Msvc32
Msvc64
出現下方提示表示庫編譯成功。
四、編譯后的內容:
Mingw32-release
Mingw64-release
Msvc32-release
Msvc64-release
打開最終的release目錄
五、在引用quazip 庫的項目的項目文件如:dbManage.pro中添加第三方庫的引用,
qt在項目上右鍵—添加庫可以打開添加庫窗口,或者在打開的dbManage.pro中右鍵—添加庫也可以打開添加庫窗口,
六、把quazip二級目錄下的頭文件(.h)和qt源程序下的zlib庫引用的頭文件(zlib.h,zconf.h)全部添加到引用項目中。
如果缺少了某個頭文件,會有錯誤提示:*.h: No such file or directory
七、在項目中添加#include "JlCompress.h"然后就可以使用壓縮解壓函數。
如:
JlCompress::compressDir("d:\\test.zip", "d:\\test"); //壓縮
JlCompress::extractDir("d:\\test.zip", "d:\\test");//解壓縮
八、msvc編譯方式下需要(mingw編譯不需要)把quazip編譯生成的release目錄下的所有文件拷貝到引用quazip 庫的項目編譯產生的相應release目錄下。
如果通過引用項目自動生成quazip的moc文件,會有錯誤提示如下:
#編譯時出現錯誤:C2491: “QuaGzipFile::staticMetaObject”: 不允許 dllimport 靜態數據成員 的定義
#把產生的所有文件(release目錄下)加入到引用項目的目錄(release目錄下),
#如果項目中只引入頭文件(*.h)和dll和lib文件,項目中會重新生成moc_*.cpp和moc_*.obj中的staticMetaObject出現錯誤提示
QuaZIP類說明
類 |
說明 |
JlCompress |
典型操作工具類 |
QuaAdler32 |
Adler32算法校驗和 |
QuaChecksum32 |
校驗和接口 |
QuaCrc32 |
CRC32校驗和 |
QuaGzipFile |
GZIP 文件操作 |
QuaZIODevice |
壓縮/解壓 QIODevice |
QuaZip |
ZIP 文件 |
QuaZipDir |
ZIP文件內目錄導航 |
QuaZipFile |
ZIP文件內的文件 |
QuaZipFileInfo |
ZIP壓縮包內的文件信息 |
QuaZipFilePrivate |
QuaZip的接口 |
QuaZipNewInfo |
被創建的文件信息 |
QuaZipPrivate |
QuaZIP內部類 |
使用
接口說明
QuaZip中的JlCompress類用來壓縮和解壓縮文件
/**
壓縮文件夾
參數一fileCompressed:壓縮后的文件
參數二dir:待壓縮的目錄
參數三recursive:是否遞歸
**/
static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);
/**
解壓縮文件夾
參數一fileCompressed:待解壓縮的文件
參數二fileCompressed:解壓縮存放的目錄
**/
static QStringList extractDir(QString fileCompressed, QString dir = QString());
其中mingw和msvc方式生成的文件后綴有區別(.o , .a , .h , .dll , .cpp)和(.obj , .lib , .h , .dll ,.cpp , .exp)