minizlib
ZLIB开源库采用的是DEFLATE压缩算法,已经不支持加密功能,实际上功能还存在于代码中,采用MINIZIP可以支持对ZIP文件的加解密。
ZLIB目前最新的是1.2.7,MINIZIP最新的版本是1.1。
采用ZLIB可以解压缩任何ZIP文件,也可以压缩成ZIP文件被WINZIP/WINRAR/7Z等工具打开。
注意:如果采用了加密功能,ZLIB加密的文件只能被ZLIB解开,WINRAR/WINZIP打不开,7Z可以打开,但其它工具加密的ZIP文件ZLIB可以打开,令人费解,
长期不支持加密失去维护造成的。
注:已经确认调用zipOpenNewFileInZip4前需要用crc32函数计算文件CRC值,当做参数传入函数即可,具体代码参照minizip.c文件。
采用MINIZIP进行文件压缩:
如果要支持加密,需要屏蔽unzip.c中的NOUNCRYPT宏定义。
创建压缩流
zipFile zf=NULL;
zf = zipOpen64(zipFile,0);
压缩文件
zip_fileinfo FileInfo;
ZeroMemory(&FileInfo, sizeof(FileInfo));
zipOpenNewFileInZip4(zf,buf, &FileInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED,level,0, -MAX_WBITS, DEF_MEM_LEVEL,
Z_DEFAULT_STRATEGY,password, 0, 0, ZIP_GPBF_LANGUAGE_ENCODING_FLAG);
注意buf为文件名,password为空时需要给NULL,level为压缩比,9为最高,0最低。
写入压缩文件
zipWriteInFileInZip(zf,data,size)
关闭当前文件
zipCloseFileInZip(zf);
关闭流
zipClose(zf,0);
采用MINIZIP进行文件解压缩:
unzFile uf=NULL;
unz_global_info64 gi;
unz_file_info64 FileInfo;
打开zip文件
uf = unzOpen64(szZipFile);
result=unzGetGlobalInfo64(uf, &gi);
if (result != UNZ_OK)
throw “文件错误”;
循环解压缩文件
for(int i=0;i<gi.number_entry;++i)
{
if (unzGetCurrentFileInfo64(uf, &FileInfo,file,sizeof(file),NULL,0,NULL,0)!= UNZ_OK)
throw “文件错误”;
if(!(FileInfo.external_fa & FILE_ATTRIBUTE_DIRECTORY)) //文件,否则为目录
//打开文件
result=unzOpenCurrentFile(uf);/* 无密码 */
result=unzOpenCurrentFilePassword(uf,szPassword); /* 有密码 */
//读取内容
size= unzReadCurrentFile(uf,data,size);
//关闭当前文件
unzCloseCurrentFile(uf);
//出错
if(i < gi.number_entry - 1 && unzGoToNextFile(uf) != UNZ_OK)
throw “error”;
}
关闭流
unzClose(uf);
minizlib的更多相关文章
- 问题: 揭秘Angualr2 书上问卷调查
npm install 初夏下面问题: 0 info it worked if it ends with ok1 verbose cli [ '/home/linux_ubuntu164/tools/ ...
- ES系列二、CentOS7安装ES head6.3.1
1.Head插件简介 ElasticSearch-head是一个H5编写的ElasticSearch集群操作和管理工具,可以对集群进行傻瓜式操作. 显示集群的拓扑,并且能够执行索引和节点级别操作 搜索 ...
- gdal3.1.0+VS2017+geos+kml编译总结
1.简介 gdal3.1.0编译过程中必须依赖proj,编译gdal必须要编译proj,proj的编译需要sqlite3,因此想要编译gdal3.1.0需要先编译proj和sqlite3 2.关于sq ...
- Entrypoint undefined = index.html html-webpack-plugin 错误ERROR in Error: Child compilation failed: Module build failed (from ./node_modules/html-webpack-plu SyntaxError: Unexpected token )
Entrypoint undefined = index.html html-webpack-plugin 错误 ERROR in Error: Child compilation failed: M ...
随机推荐
- Kinect 开发 —— 骨骼数据与彩色影像和深度影像的对齐
在显示彩色影像和深度影像时最好使用WriteableBitmap对象: 要想将骨骼数据影像和深度影像,或者彩色影像叠加到一起,首先要确定深度影像的分辨率和大小,为了方便,这里将深度影像数据和彩色影像数 ...
- Dubbo简易学习
0. Dubbo简易介绍 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000, ...
- 7lession-基础数据使用介绍
1.数值 这个使用比较简单 a = 1 b = 3.2 c = 12.5+4j d = 20L 2.字符串 代码 s = "hello world,i am comming" pr ...
- [LuoguU41039]PION后缀自动机 树链剖分+动态开点线段树
链接 刚开始看出题人题解都吓蒙掉了,还以为是什么难题,结果就一板子题 思路:对每一个文件名开一棵线段树,然后树剖即可 #include<bits/stdc++.h> #define REP ...
- HTTP协议建立连接、通讯与关闭连接全过程
为解决服务器TimeWait多的问题,了解了一下TCP/IP协议的连接过程.以访问一静态页面为例,从建立连接到访问拿到数据,然后关闭的整个过程.使用EtherPeek截图如下: 图首为一次交互过程 ...
- 升级你的Linux日志系统
650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" ...
- golang sync.RWMutex
sync.RWMutex package main import ( "fmt" "runtime" "sync" ) func click ...
- golang pipe
===============golang pipe============== package main import ( "fmt" "io" ) func ...
- C# Unity依赖注入利用Attribute实现AOP功能
使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...
- 程序是怎么跑起来的? —— CPU 是什么?C/C++程序的运行
1. 概念初步 程序:计算机的程序,和做饭.运动会的程序一样,指的是"做事的先后次序": 程序的组成:程序是指令(及物动词)和数据(宾语)的组合体: C 语言 printf(&qu ...