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

  • 相关阅读:
    五,系统操作命令说明
    三,linux系统的由来
    二,服务器磁盘阵列(raid)
    一服务器硬件介绍
    四,元组类型
    集合类型
    字典类型
    三,列表类型
    二,字符串类型
    一,数字类型
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4061651.html
Copyright © 2011-2022 走看看