项目需求:

在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

  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. QString zipLocation = "C:\\Users\\Administrator\\Desktop\\test.zip";
  5. QuaZip zip(zipLocation);
  6. zip.setFileNameCodec("IBM866");
  7. if(!zip.open(QuaZip::mdCreate)){
  8. qDebug() << "error .... 1";
  9. }
  10. QuaZipFile outFile(&zip);
  11. for(int i = 0 ; i < wrapper.size() ; i++){
  12. QFileInfo file(wrapper.at(i));
  13. if(file.exists()){
  14. QFile inFile ;
  15. QFile inFileTemp ;
  16. inFileTemp.setFileName(file.fileName());
  17. inFile.setFileName(file.filePath());
  18. if(!inFile.open(QIODevice::ReadOnly)){
  19. qDebug() << "error ....2";
  20. qDebug() << inFile.errorString().toLocal8Bit().constData();
  21. }
  22. if(!outFile.open(QIODevice::WriteOnly , QuaZipNewInfo(inFileTemp.fileName() , inFile.fileName()))){
  23. qDebug() << "error ...3";
  24. }
  25. outFile.write(inFile.readAll());
  26. if(outFile.getZipError() != UNZ_OK){
  27. qDebug() << "error ...4";
  28. }
  29. outFile.close();
  30. if(outFile.getZipError() != UNZ_OK){
  31. qDebug() << "error ....5";
  32. }
  33. inFile.close();
  34. }
  35. }
  36. zip.close();
  37. if(zip.getZipError()){
  38. qDebug() << "error ...6";
  39. }

程序运行结果:在桌面生成test.zip压缩文件,且利用解压工具可以正常解压,里面包含两个文件,且均可以正常打开,一切正常。

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

QuaZip实现多文件打包的更多相关文章

  1. 【JavaScript】 Webpack安装及文件打包

    背景 最近开启一个新项目,需要对前端的各类资源文件进行打包,经过多方调研后,决定使用webpack工具.但是网上的教程多是将webpack直接作为服务器使用,而我只是想将其作为单纯的资源打包工具而已. ...

  2. 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结:                                                          使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文: ...

  3. .deb文件打包

    最近因项目需要,需要把文件夹打包为.deb格式的包,幸亏一位朋友帮忙指导了我一个晚上,才得以完成,这里再次对他表示感谢. 整理打包流程如下: 请先参考此博客内容,了解deb文件打包 如何制作Deb包和 ...

  4. Linux 系统常用命令汇总(六) 文件打包与压缩

    文件打包与压缩 命令 选项 注解 示例 compress 文件名 压缩指定的文件,压缩后的格式为*.z compress install.log -d 解压被压缩的文件  .z为后缀的文件:compr ...

  5. Delphi 中将一些 Dll等生成资源文件打包成一个独立的EXE程序方法步骤

    资源文件一般为扩展名为res的文件,其自带的资源编译工具BRCC32.EXE(位于/Delphi/BIN目录下) 1.编写rc脚本文本 用记事本或其它文本编辑器编写一个扩展名为rc的文件,格式分别为在 ...

  6. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

  7. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  8. linux常用命令之--文件打包与压缩命令

    linux的文件打包与压缩命令 1.压缩与解压命令 compress:用于压缩指定的文件,后缀为.z 其命令格式如下: compress [-d] 文件名 常用参数: -d:解压被压缩的文件(.z为后 ...

  9. 如何将class文件打包成jar 这里提供两种方式!

    原地址:http://blog.163.com/09zzy@126/blog/static/711976652011101001530/ 如何将class文件打包成jar文件,这是一个很严肃的问题,当 ...

随机推荐

  1. C#编译器对于dynamic对象到底做了什么

    private static void TestMethod() { //dynamic 仅仅是个占位符而已 dynamic p1 = , Y = }; //对dynamic对象p1的X属性访问通过C ...

  2. 【HDOJ】2732 Leapin' Lizards

    贪心+网络流.对于每个结点,构建入点和出点.对于每一个lizard>0,构建边s->in position of lizard, 容量为1.对于pillar>0, 构建边in pos ...

  3. JS判断浏览器是否支持某一个CSS3属性

    1.引子 css3的出现让浏览器的表现更加的丰富多彩,表现冲击最大的就是动画了,在日常书写动画的时候,很有必要去事先判断浏览器是否支持,尤其是在写CSS3动画库的时候.比如transition的ani ...

  4. ELK之nginx日志分析图表创建

    一.kibana面板介绍 Discover:查询数据Visualize:统计图表Dashboard:显示面板,添加相应的图表在面板中Settings:创建索引 二.图表创建 1.饼图创建 以创建一个状 ...

  5. xamarin for vs2013

    安装需求(下载的包及版本) 先安装VS2013 然后到官网下Xamarin,运行后会自动下载以下文件 这是下载的详细列表 jdk-6u39-windows-i586.exe(69.73M) Andro ...

  6. Eclipse&Spring开发开发环境配置

    下载Eclipse,打开http://www.eclipse.org/downloads/,选择J2EE开发版: 根据操作系统选择32位还是64位. 开发工具:SpringSource Tool Su ...

  7. Cookie及Session文件在本机的存放位置

    1. Cookie的存放位置 D:\Users\xlxiao\AppData\Roaming\Microsoft\Windows\Cookies 2. Session的存放位置(目前未解决)

  8. 使用第三方CDN加速服务加载js/css

    ASP.NET MVC 3.0 http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.js http://ajax.aspnet ...

  9. 白帽子讲Web安全1.pdf

    第一章 我的安全世界观 安全是一个持续过程 6种威胁:Spoofing(伪装).Tampering(篡改).Repudiation(抵赖).InformationDisclosure(信息泄漏).De ...

  10. 深入设计模式(二)——单例模式(Singleton Pattern)

    一.单例模式介绍 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它 ...