前言
最近寫公司的貨架産品,在總結之前項目裡用到的代碼。立個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配置
- 解壓下載下傳的
檔案至zlib1211.zip
D:\3rdParty\zlib\zlib-1.2.11-quazip;自定義目錄:
- 打開指令行,定位到
D:\3rdParty\zlib\zlib-1.2.11-quazip後,執行以下指令;自定義目錄:
mingw32-make -f win32/Makefile.gcc
QuaZip配置
- 解壓下載下傳的
檔案至quazip-0.7.3.zip
D:\3rdParty\QuaZIP\quazip-0.7.3;自定義目錄:
- 打開指令行,定位到
D:\3rdParty\QuaZIP\quazip-0.7.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);
代碼示例
- 将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
- 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();
}
可能的問題
- 如果
,qmake
指令不能使用,那就需要配置環境變量。mingw32-make
- qmake.exe : Qt安裝目錄下的5.9.6\mingw53_32\bin
-
mingw32-make.exe : Qt安裝目錄下的Tools\mingw530_32\bin
或者
到以上目錄執行對應指令。cd
參考文獻
- Zipping and unzipping files with Qt