zoukankan      html  css  js  c++  java
  • 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:QT4.8.4src3rdpartyzlib

            从该目录下拷贝zlib.h到QuaZip项目中,重新编译又会报出如下的错误:fatal error C1083: Cannot open include file: 'zconf.h': No such file or directory

            解决方法一样,在D:QT4.8.4src3rdpartyzlib中将zconf.h文件拷贝到QuaZip目录下,重新编译,成功。

            在项目中:我们需要用的就是它编译产生的dll、lib以及QuaZip中用到的.h头文件。

    代码实现:

            这里列出我写的测试代码,这里只是一个示例,没有创建目录结构,如果创建目录结构请参考:http://stackoverflow.com/questions/13953528/how-can-i-zip-a-directory-folder-with-quazip       

    [cpp] view plaincopy
     
    1. QStringList wrapper ;  
    2.     wrapper.append(QString("C:\Users\Administrator\Desktop\fdafsa.jpg"));  
    3.     wrapper.append(QString("C:\Users\Administrator\Desktop\downloadtest\sy_car.max"));  
    4.   
    5.     QString zipLocation = "C:\Users\Administrator\Desktop\test.zip";  
    6.     QuaZip zip(zipLocation);  
    7.     zip.setFileNameCodec("IBM866");  
    8.   
    9.     if(!zip.open(QuaZip::mdCreate)){  
    10.         qDebug() << "error .... 1";  
    11.     }  
    12.   
    13.     QuaZipFile outFile(&zip);  
    14.     for(int i = 0 ; i < wrapper.size() ; i++){  
    15.         QFileInfo file(wrapper.at(i));  
    16.   
    17.         if(file.exists()){  
    18.   
    19.             QFile inFile ;  
    20.             QFile inFileTemp ;            
    21.   
    22.             inFileTemp.setFileName(file.fileName());  
    23.             inFile.setFileName(file.filePath());  
    24.   
    25.             if(!inFile.open(QIODevice::ReadOnly)){  
    26.                 qDebug() << "error ....2";  
    27.                 qDebug() << inFile.errorString().toLocal8Bit().constData();  
    28.             }  
    29.   
    30.             if(!outFile.open(QIODevice::WriteOnly , QuaZipNewInfo(inFileTemp.fileName() , inFile.fileName()))){  
    31.                 qDebug() << "error ...3";  
    32.             }  
    33.       
    34.             outFile.write(inFile.readAll());  
    35.   
    36.             if(outFile.getZipError() != UNZ_OK){  
    37.                 qDebug() << "error ...4";  
    38.             }  
    39.   
    40.             outFile.close();  
    41.   
    42.             if(outFile.getZipError() != UNZ_OK){  
    43.                 qDebug() << "error ....5";  
    44.             }  
    45.   
    46.             inFile.close();  
    47.         }  
    48.   
    49.   
    50.     }  
    51.   
    52.     zip.close();  
    53.   
    54.     if(zip.getZipError()){  
    55.         qDebug() << "error ...6";  
    56.     }  
    程序运行结果:在桌面生成test.zip压缩文件,且利用解压工具可以正常解压,里面包含两个文件,且均可以正常打开,一切正常。

            明天就是要过清明节了,要和女朋友去南京,这还是来苏州后第一次出去玩。想想这周的工作,还有很多需要整理的工作,等节后再继续吧,女朋友为了去南京准备了好多,又是买车票,又是查路线,好感动滴说,哎,有个IT的男友真是不幸。

  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4061651.html
Copyright © 2011-2022 走看看