代码很简单,具体过程就不写了。

关于加密压缩,可以看http://www.zlib.net/zlib_faq.html#faq38 中的描述,说是不支持的,但是创建的时候可以传入密码进去,不过我还没有搞清楚这个密码要如何设置。

压缩算法模式参数:

0 - 存储文件 (无压缩)

8 - 文件使用Deflated算法压缩

9 - 使用Deflate64(tm)压缩

10 - PKWARE数据压缩库

12 - 文件使用BZIP2算法压缩

  1. #include "zlib.h"
  2. #include "zip.h"
  3. #ifdef _WIN32
  4. #define USEWIN32IOAPI
  5. #include "iowin32.h"
  6. #endif
  7. #include <QFile>
  8. #include <QDir>
  9. #include <QDateTime>
  10. /*转换Qstring到utf8字符串*/
  11. inline std::string ToUtf8(const QString& str)
  12. {
  13. QByteArray u8 = str.toUtf8();
  14. return std::string(u8.data(),u8.size());
  15. }
  16. QStringList FileListR(const QDir& dir)
  17. {
  18. QFileInfoList fileinfolist = dir.entryInfoList(
  19. QDir::NoDotAndDotDot|QDir::Files|QDir::Dirs);
  20. QStringList files;
  21. for(int i=0;i<fileinfolist.size();++i){
  22. QFileInfo& info = fileinfolist[i];
  23. if(info.isDir()){
  24. files.append(FileListR(QDir(info.filePath())));
  25. continue;
  26. }
  27. files.append(info.filePath());
  28. }
  29. return files;
  30. }
  31. // zlib打包压缩测试
  32. void zlib_archive_compress(QString path,QString outpath)
  33. {
  34. QDir dir(path);
  35. QStringList entrylist = FileListR(dir);
  36. int err = 0;
  37. zipFile zipfile;
  38. #ifdef _WIN32
  39. zlib_filefunc64_def ffunc64;
  40. fill_win32_filefunc64W(&ffunc64);
  41. std::wstring wpath = outpath.toStdWString();
  42. // APPEND_STATUS_CREATE 不存在就创建,存在就截断(清空)
  43. // APPEND_STATUS_ADDINZIP 不存在打开失败,存在就追加(原本压缩包中的内容不清空)
  44. // APPEND_STATUS_CREATEAFTER 不存在打开失败,存在就截断(清空)
  45. zipfile = zipOpen2_64(wpath.c_str(),APPEND_STATUS_CREATE,NULL,&ffunc64);
  46. #else
  47. zipfile = zipOpen64(ToUtf8(path).c_str(),APPEND_STATUS_CREATE);
  48. #endif
  49. if(zipfile == NULL){
  50. qDebug()<<"zipOpen64 error " << ZIP_ERRNO;
  51. return;
  52. }
  53. // 逐个文件添加
  54. for(int i=0;i<entrylist.size();++i){
  55. QFileInfo info(entrylist[i]);
  56. QDateTime ctime = info.created(); // 获取文件创建时间
  57. zip_fileinfo zipinfo;
  58. zipinfo.tmz_date.tm_year = ctime.date().year();
  59. zipinfo.tmz_date.tm_mon = ctime.date().month();
  60. zipinfo.tmz_date.tm_mday = ctime.date().day();
  61. zipinfo.tmz_date.tm_hour = ctime.time().hour();
  62. zipinfo.tmz_date.tm_min = ctime.time().minute();
  63. zipinfo.tmz_date.tm_sec = ctime.time().second();
  64. zipinfo.dosDate = 0;
  65. zipinfo.external_fa = zipinfo.internal_fa = 0;
  66. // 在zip包中打开一个新文件
  67. err = zipOpenNewFileInZip3_64(
  68. zipfile,
  69. ToUtf8(info.filePath().remove(dir.path())).c_str(),/*在zip文件中的文件路径(我这里使用UTF8,可以根据需求自己抉择,文件名可以重复)*/
  70. &zipinfo,
  71. NULL,0,NULL,0,NULL,
  72. Z_DEFLATED,Z_DEFAULT_COMPRESSION, /*压缩参数(默认参数)*/
  73. 0,-MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY,
  74. NULL /*加密参数(不加密)*/ ,0 /*crc校验值*/,0 /*是否为zip64*/
  75. );
  76. // 在zip包中添加新文件失败
  77. if(err != ZIP_OK){
  78. qDebug()<<QString::fromAscii("zipOpenNewFileInZip3_64 failed ")<<err;
  79. zipCloseFileInZip(zipfile);
  80. break;
  81. }
  82. QFile file(info.filePath());
  83. if(!file.open(QIODevice::ReadOnly)){
  84. qDebug()<<QString::fromAscii("OpenFile failed ")<<file.fileName();
  85. zipCloseFileInZip(zipfile);
  86. continue;
  87. }
  88. // 读取文件内容,写入zip包文件
  89. qint64 filesize = file.size();
  90. for(qint64 rbeg = 0;rbeg<filesize;rbeg+=(4<<20)){
  91. QByteArray buffer = file.read(4<<20);
  92. err = zipWriteInFileInZip(zipfile,buffer.data(),buffer.size());
  93. if(err < 0){
  94. qDebug()<<"error : "<<err;
  95. break;
  96. }
  97. }
  98. zipCloseFileInZip(zipfile);
  99. }
  100. err = zipClose(zipfile,NULL);
  101. if(err < 0){
  102. qDebug()<<"error : "<<err;
  103. }
  104. }
  105. int main(int argc, char *argv[])
  106. {
  107. QTime time;
  108. time.start();
  109. zlib_archive_compress(
  110. QString::fromLocal8Bit("Z:/Everything-SDK/src"),
  111. QString::fromLocal8Bit("Z:/Everything-SDK/srctest.zip"));
  112. int t = time.elapsed();
  113. qDebug()<<t<<" ms";
  114. return 0;
  115. }

使用zlib库进行目录打包的更多相关文章

  1. 利用zlib库进行zip解压

    1:到zlib官网上下载zlib,本文下载的是1.2.8的版本. 2:进行./configure,然后make. 3:进入zlib库中的contrib/minizip/路径下make,生成的miniz ...

  2. ZLIB 库

    zlib 编辑 zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表.zlib使用DEFLATE算法,最初是为libp ...

  3. Windows下zlib库和libPng库的编译和使用

    关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...

  4. zlib库VS2015编译步骤

    [点击这里下载zlib1.2.8源码](http://zlib.net/zlib128.zip) [点击这里下载zlib1.2.8编译动态库](http://zlib.net/zlib128-dll. ...

  5. zlib库的编译及使用

    * 打开网址http://zlib.net/ 下载zlib源码, * 解压压缩包,进入目录:C:\Users\Administrator\Desktop\zlib-1.2.11\zlib-1.2.11 ...

  6. Windows / Linux 一件编译zlib库

    一. 下载zlib库 : http://www.zlib.net 本文以  zlib-.tar.xz  为例 二. 解压文件得到 zlib- 文件夹,修改 zlib-/CMakeLists.txt 文 ...

  7. vs2013载入zlib库,即include "zlib.h"

    转自wo13142yanyouxin原文vs2013载入zlib库,即include "zlib.h" 在程序中,我们经常要用到压缩,解压函数.以压缩函数compress为例进行说 ...

  8. png库结合zlib库使用出现的一个链接问题的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 要使用png库,首先得编译png库,要编译png库,得依赖zlib库的头文件.在使用png库读取一个png文件时,代码 ...

  9. QT+OpenGL(02)-- zlib库的编译

    1.zlib库的下载 http://www.zlib.net/ zlib1211.zip 2.解压 3.进入  zlib1211\zlib-1.2.11\contrib\vstudio\vc14 目录 ...

随机推荐

  1. 2018-2019 2 20165203 《网络对抗技术》 Exp2 后门原理与实践

    2018-2019 2 20165203 <网络对抗技术> Exp2 后门原理与实践 实验内容 1.使用netcat获取主机操作Shell,cron启动 (0.5分) 2.使用socat获 ...

  2. 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句

    在 application.properties 中加入以下配置 spring.jpa.show-sql=true

  3. Could not find com.android.tools.build:aapt2:3.2.0-alpha14-4748712.

    https://blog.csdn.net/lx6101989/article/details/80334232 android studio 升级到了3.0 取消了apt 报了这个错 在最上级的bu ...

  4. python:a += b 和 a = a + b

    在python中,不同的情况下,这两个表达式有着很大的区别: 如果a,b都是可变对象,例如list,a+=b实际是对a指向的地址上的值进行修改,即运算前后id(a)的值是不变的. 而a=a+b是不同的 ...

  5. tarjan 算法求强连通分量

    #include<bits/stdc++.h> #define ll long long using namespace std; const int P=1e6; ; ; const i ...

  6. 094实战 关于js SDK的程序,java SDK的程序

    一:JS SDK 1.修改配置workspace 2.导入 3.Demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Trans ...

  7. 在python3下使用requests,xpath,urllib爬取不得姐网站相关视频爬虫源代码

    #coding=utf-8 from lxml import etreeimport requestsimport urllibimport os # 获取url的html等内容def getHtml ...

  8. java中使用switch-case的用法及注意事项超全总结

    http://m.blog.csdn.net/blog/tianyazaiheruan/8988420 今天陈红军老师在用到switch的时候,这种设计到最基本的内容,可能忘记它的一些基本语法,出现了 ...

  9. Spark函数式编程进阶

    函数式编程进阶 1.函数和变量一样作为Scala语言的一等公民,函数可以直接复制给变量: 2.函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是匿名函数赋值给 ...

  10. IBM NOTES

    归档含义 邮件容量超过指定的邮件服务器的容量时,会受到警告信息.选择 Archive-Settings 可以设置邮件备份的规则,把邮箱里的部分邮件转移到本地的另一个指定文件夹(如 图 4).当您需要做 ...