天天看點

【大話QT之二】QuaZip實作多檔案打包

項目需求:

        在Goldenfarm用戶端中當使用者選擇了本地場景檔案,并進行本地場景檔案分析後會産生分析結果,分析結果主要包括:貼圖紋理、可渲染層等,其中貼圖紋理指出了在場景檔案中使用到的貼圖或其它檔案。在作業實際送出之前,需要将檔案打包,然後上傳到FTP,其中貼圖紋理檔案的打包采用QT的第三方控件QuaZip來實作。

        本地場景分析之後産生的結果如下圖所示:

【大話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的男友真是不幸。