您的位置:首页 > 其它

minizlib

2015-07-18 21:35 253 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: