from:http://www.luoriver.com/news-d-i233-s25-m58-b58.html
ZLIB開源庫采用的是DEFLATE壓縮算法,已經不支援加密功能,實際上功能還存在于代碼中,采用MINIZIP可以支援對ZIP檔案的加解密。
ZLIB目前最新的是1.2.7,MINIZIP最新的版本是1.1。
采用ZLIB可以解壓縮任何ZIP檔案,也可以壓縮成ZIP檔案被WINZIP/WINRAR/7Z等工具打開。
注意:如果采用了加密功能,ZLIB加密的檔案隻能被ZLIB解開,WINRAR/WINZIP打不開,7Z可以打開,但其它工具加密的ZIP檔案ZLIB可以打開,令人費解,
長期不支援加密失去維護造成的。
采用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);