【大話QT之二】QuaZip實現多文件打包

項目需求:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章