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的更多相关文章

  1. 问题: 揭秘Angualr2 书上问卷调查

    npm install 初夏下面问题: 0 info it worked if it ends with ok1 verbose cli [ '/home/linux_ubuntu164/tools/ ...

  2. ES系列二、CentOS7安装ES head6.3.1

    1.Head插件简介 ElasticSearch-head是一个H5编写的ElasticSearch集群操作和管理工具,可以对集群进行傻瓜式操作. 显示集群的拓扑,并且能够执行索引和节点级别操作 搜索 ...

  3. gdal3.1.0+VS2017+geos+kml编译总结

    1.简介 gdal3.1.0编译过程中必须依赖proj,编译gdal必须要编译proj,proj的编译需要sqlite3,因此想要编译gdal3.1.0需要先编译proj和sqlite3 2.关于sq ...

  4. 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 ...

随机推荐

  1. UITouch 的使用

    直接上代码: touch 的四大状态.: // // TouchView.m // UI_practice_04 // // Created by lanouhn on 15/4/22. // Cop ...

  2. php课程 12-40 抽象类的作用是什么

    php课程 12-40 抽象类的作用是什么 一.总结 一句话总结:定标准的 1.继承的关键词有哪两个? extendsparent 2.抽象类的实际意义是什么? 制造符合规范的产品你必须实现了抽象类里 ...

  3. ASP.NET MVC 4 (十一) Bundles和显示模式--asp.net mvc中 @Scripts.Render("~/bundles/jquery")是什么意思? 在布局文件中使用Scripts.Render()输出脚本包,Styles.Render()输出风格包:

    ASP.NET MVC 4 (十一) Bundles和显示模式 ASP.NET MVC 4 引入的js打包压缩功能.打包压缩jquery目录下的文件,在布局文件中使用Scripts.Render()输 ...

  4. HTML5的设计目的是为了在移动设备上支持多媒体

    HTML5的设计目的是为了在移动设备上支持多媒体

  5. Vue 的 createElement 函数的参数问题的小笔记

    官方文档的说明. 第二个参数的值是要生成的标签的属性数据.点击查看详情. 第三个参数则是组件标签内的数据,数据里面的内容会渲染在第一个参数的标签内.通常会在此指定各插槽 slot 对应的位置,也可以在 ...

  6. x64系统下,InpOutx64有数字签名而WinIO3.0无数字签名

    参考文档 http://www.highrez.co.uk/Downloads/InpOut32/ //可以下载InpOutx64的驱动程序及DLL,还有驱动主板硬件IO的例程 https://www ...

  7. Native开发与JNI机制详解

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/李森 博主导读:博主不是代码大师,研究什么都很深,Java除外,所以无论什么问题,方案可以提供, ...

  8. http 500 Internal Server Error的错误 ajax请求SpringMVC后台中返回500 Internal Server Error

    使用httprequester接口测试能返回数据,但是用ajax返回json格式的时候返回报500Internal Server Error. The server encountered an in ...

  9. 洛谷 P1327 数列排序

    P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...

  10. UVA 11557 - Code Theft (KMP + HASH)

    UVA 11557 - Code Theft 题目链接 题意:给定一些代码文本.然后在给定一个现有文本,找出这个现有文本和前面代码文本,反复连续行最多的这些文本 思路:把每一行hash成一个值.然后对 ...