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

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

压缩算法模式参数:

0 - 存储文件 (无压缩)

8 - 文件使用Deflated算法压缩

9 - 使用Deflate64(tm)压缩

10 - PKWARE数据压缩库

12 - 文件使用BZIP2算法压缩

#include "zlib.h"
#include "zip.h"
#ifdef _WIN32
#define USEWIN32IOAPI
#include "iowin32.h"
#endif #include <QFile>
#include <QDir>
#include <QDateTime> /*转换Qstring到utf8字符串*/
inline std::string ToUtf8(const QString& str)
{
QByteArray u8 = str.toUtf8();
return std::string(u8.data(),u8.size());
} QStringList FileListR(const QDir& dir)
{
QFileInfoList fileinfolist = dir.entryInfoList(
QDir::NoDotAndDotDot|QDir::Files|QDir::Dirs);
QStringList files;
for(int i=0;i<fileinfolist.size();++i){
QFileInfo& info = fileinfolist[i];
if(info.isDir()){
files.append(FileListR(QDir(info.filePath())));
continue;
}
files.append(info.filePath());
}
return files;
} // zlib打包压缩测试
void zlib_archive_compress(QString path,QString outpath)
{
QDir dir(path);
QStringList entrylist = FileListR(dir); int err = 0;
zipFile zipfile; #ifdef _WIN32
zlib_filefunc64_def ffunc64;
fill_win32_filefunc64W(&ffunc64);
std::wstring wpath = outpath.toStdWString(); // APPEND_STATUS_CREATE 不存在就创建,存在就截断(清空)
// APPEND_STATUS_ADDINZIP 不存在打开失败,存在就追加(原本压缩包中的内容不清空)
// APPEND_STATUS_CREATEAFTER 不存在打开失败,存在就截断(清空)
zipfile = zipOpen2_64(wpath.c_str(),APPEND_STATUS_CREATE,NULL,&ffunc64);
#else
zipfile = zipOpen64(ToUtf8(path).c_str(),APPEND_STATUS_CREATE);
#endif
if(zipfile == NULL){
qDebug()<<"zipOpen64 error " << ZIP_ERRNO;
return;
} // 逐个文件添加
for(int i=0;i<entrylist.size();++i){
QFileInfo info(entrylist[i]);
QDateTime ctime = info.created(); // 获取文件创建时间
zip_fileinfo zipinfo;
zipinfo.tmz_date.tm_year = ctime.date().year();
zipinfo.tmz_date.tm_mon = ctime.date().month();
zipinfo.tmz_date.tm_mday = ctime.date().day();
zipinfo.tmz_date.tm_hour = ctime.time().hour();
zipinfo.tmz_date.tm_min = ctime.time().minute();
zipinfo.tmz_date.tm_sec = ctime.time().second();
zipinfo.dosDate = 0;
zipinfo.external_fa = zipinfo.internal_fa = 0; // 在zip包中打开一个新文件
err = zipOpenNewFileInZip3_64(
zipfile,
ToUtf8(info.filePath().remove(dir.path())).c_str(),/*在zip文件中的文件路径(我这里使用UTF8,可以根据需求自己抉择,文件名可以重复)*/
&zipinfo,
NULL,0,NULL,0,NULL,
Z_DEFLATED,Z_DEFAULT_COMPRESSION, /*压缩参数(默认参数)*/
0,-MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY,
NULL /*加密参数(不加密)*/ ,0 /*crc校验值*/,0 /*是否为zip64*/
);
// 在zip包中添加新文件失败
if(err != ZIP_OK){
qDebug()<<QString::fromAscii("zipOpenNewFileInZip3_64 failed ")<<err;
zipCloseFileInZip(zipfile);
break;
}
QFile file(info.filePath());
if(!file.open(QIODevice::ReadOnly)){
qDebug()<<QString::fromAscii("OpenFile failed ")<<file.fileName();
zipCloseFileInZip(zipfile);
continue;
}
// 读取文件内容,写入zip包文件
qint64 filesize = file.size();
for(qint64 rbeg = 0;rbeg<filesize;rbeg+=(4<<20)){
QByteArray buffer = file.read(4<<20);
err = zipWriteInFileInZip(zipfile,buffer.data(),buffer.size());
if(err < 0){
qDebug()<<"error : "<<err;
break;
}
}
zipCloseFileInZip(zipfile);
} err = zipClose(zipfile,NULL);
if(err < 0){
qDebug()<<"error : "<<err;
}
} int main(int argc, char *argv[])
{
QTime time;
time.start();
zlib_archive_compress(
QString::fromLocal8Bit("Z:/Everything-SDK/src"),
QString::fromLocal8Bit("Z:/Everything-SDK/srctest.zip"));
int t = time.elapsed();
qDebug()<<t<<" ms";
return 0;
}

使用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. [转] iOS开发工具——网络封包分析工具Charles

    简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使 ...

  2. ES6精简要点

    没想到ES7都出来了(虽然并不大),想到自己ES6还没学完 现在就补补吧,记录下重点部分 Let的用法 用来声明块级变量 f1();function f1() { let n = 5; if (tru ...

  3. [ZJOI2010]贪吃的老鼠

    很不错的一道网络流的题目 二分答案是显然的 首先不考虑每个饼干只能一个老鼠吃 那很显然的建图就是将时间点按照开始结束的点分成2*n-1段 然后对每一段时间建m个老鼠的点,然后s-它限流,再从它到目前可 ...

  4. Codeforces 585D Lizard Era: Beginning

    Lizard Era: Beginning 折半之后搜就完事了, 直接存string字符串卡空间, 随便卡卡空间吧. #include<bits/stdc++.h> #define LL ...

  5. 第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理

    1.Navicat工具与pymysql模块 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数 ...

  6. mysql5.7一键安装脚本

    0. 概述 最近鼓捣出了一个mysql安装脚本,将该脚本,mysql的my.cnf文件,mysql的安装包这三个文件放在同一个目录下面,执行sh mysql-auto-install.sh就可以完成m ...

  7. ReportNG报表显示中文乱码和TestNG显示中文乱码实力解决办法

    最近在进军测试自动化框架学习阶段,但无意间总是会伴随小问题的困扰,比如中文乱码,而导致显示总是不舒服,个人觉得,就一定要解决,似乎有点点强迫症.所以遇到ReportNG报表显示中文乱码和TestNG显 ...

  8. HTTP那些事儿

    一.HTTP和HTTPSHTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS.HTTP是超文本传输协议,信息是明文传输 ...

  9. JSONObject基本内容(三)

    参考资料:http://swiftlet.net/archives/category/json    十分感谢!!!~~ 第三篇的内容,主要讲述的有两点: 1 .如何获取JSONObject中对应ke ...

  10. python-docx

    pip install python-docx 注意不要直接下载docx包 from docx import Document from docx.shared import RGBColor,Inc ...