項目需求:
在Goldenfarm客戶端中當用戶選擇了本地場景文件,並進行本地場景文件分析後會產生分析結果,分析結果主要包括:貼圖紋理、可渲染層等,其中貼圖紋理指出了在場景文件中使用到的貼圖或其它文件。在作業實際提交之前,需要將文件打包,然後上傳到FTP,其中貼圖紋理文件的打包採用QT的第三方控件QuaZip來實現。
本地場景分析之後產生的結果如下圖所示:
方法調研:
QT的提供了qCompress/qUncompress方法來提供文件的壓縮與解壓,但是它存在的一個問題是:它只是單純地將一個文件壓縮爲某種格式的壓縮文件,但是壓縮後的文件無法通過其它解壓工具打開,例如:7zip,或winRar,只能通過qUncompress將它解壓讀取出來,也就是說qCompress生成的壓縮文件不包含普通壓縮文件的一些頭信息,導致無法解壓。
QuaZip是使用QT、C++對zlib進行簡單封裝的用於壓縮zip以及解壓縮zip的開源庫。適用於多種平臺。利用它可以很方便的將單個或多個文件打包爲zip文件,且打包後的zip文件可以通過其它工具打開,滿足我們的需求。
QuaZip編譯:
注意:QuaZip是基於ZLIB庫的,因此編譯之前必須編譯完ZLIB或者導入ZLIB的頭文件。這裏編譯的過程中採用後者,因爲很簡單,編譯完成後我們使用它的 dll、lib以及.h頭文件。
QuaZip源碼包下載地址:http://sourceforge.net/projects/quazip/
利用VS2010打開QT項目,然後編譯,由於沒有zlib.h文件,它會報出如下錯誤:fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
解決方法,將zlib.h放入該項目中,我的QT版本是:4.8.3,在它src的第三方庫中已經包含了zlib庫,zlib庫在QT中的目錄爲:D:\QT\4.8.4\src\3rdparty\zlib
從該目錄下拷貝zlib.h到QuaZip項目中,重新編譯又會報出如下的錯誤:fatal error C1083: Cannot open include file: 'zconf.h': No such file or directory
解決方法一樣,在D:\QT\4.8.4\src\3rdparty\zlib中將zconf.h文件拷貝到QuaZip目錄下,重新編譯,成功。
在項目中:我們需要用的就是它編譯產生的dll、lib以及QuaZip中用到的.h頭文件。
代碼實現:
這裏列出我寫的測試代碼,這裏只是一個示例,沒有創建目錄結構,如果創建目錄結構請參考:http://stackoverflow.com/questions/13953528/how-can-i-zip-a-directory-folder-with-quazip
QStringList wrapper ;
wrapper.append(QString("C:\\Users\\Administrator\\Desktop\\fdafsa.jpg"));
wrapper.append(QString("C:\\Users\\Administrator\\Desktop\\downloadtest\\sy_car.max"));
QString zipLocation = "C:\\Users\\Administrator\\Desktop\\test.zip";
QuaZip zip(zipLocation);
zip.setFileNameCodec("IBM866");
if(!zip.open(QuaZip::mdCreate)){
qDebug() << "error .... 1";
}
QuaZipFile outFile(&zip);
for(int i = 0 ; i < wrapper.size() ; i++){
QFileInfo file(wrapper.at(i));
if(file.exists()){
QFile inFile ;
QFile inFileTemp ;
inFileTemp.setFileName(file.fileName());
inFile.setFileName(file.filePath());
if(!inFile.open(QIODevice::ReadOnly)){
qDebug() << "error ....2";
qDebug() << inFile.errorString().toLocal8Bit().constData();
}
if(!outFile.open(QIODevice::WriteOnly , QuaZipNewInfo(inFileTemp.fileName() , inFile.fileName()))){
qDebug() << "error ...3";
}
outFile.write(inFile.readAll());
if(outFile.getZipError() != UNZ_OK){
qDebug() << "error ...4";
}
outFile.close();
if(outFile.getZipError() != UNZ_OK){
qDebug() << "error ....5";
}
inFile.close();
}
}
zip.close();
if(zip.getZipError()){
qDebug() << "error ...6";
}
程序運行結果:在桌面生成test.zip壓縮文件,且利用解壓工具可以正常解壓,裏面包含兩個文件,且均可以正常打開,一切正常。
明天就是要過清明節了,要和女朋友去南京,這還是來蘇州後第一次出去玩。想想這周的工作,還有很多需要整理的工作,等節後再繼續吧,女朋友爲了去南京準備了好多,又是買車票,又是查路線,好感動滴說,哎,有個IT的男友真是不幸。