ZLib+minizip实现ZIP压缩解压
文件压缩的老搭档,ZLib和minizip,真的挺好用。ZLib主打压缩算法,比如经典的 DEFLATE,压缩率不错,速度也稳。minizip是它的兄弟,用来 ZIP 格式更方便,比如加文件、解压、设密码这些常规操作全都能搞定。
跨平台的 ZLib 库,支持 C、C++、Python,几乎你想得到的语言它都能用。压缩的时候你只要搞定几个参数,剩下的 ZLib 帮你跑。像下面这样初始化一下:
#include "zlib.h"
int zlib_initialized = inflateInit();
minizipZIP 文件就更直观了,读写文件的 API 写得还挺清爽。比如你要压个file.txt
进去,直接上:
zipFile zip = zipOpen2("example.zip", APPEND_STATUS_CREATE, NULL);
if (zip != NULL) {
zipOpenNewFileInZip3_64(zip, "file.txt", NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0);
zipWriteInFileInZip(zip, "内容", strlen("内容"));
zipCloseFileInZip(zip);
zipClose(zip, NULL);
}
解压 ZIP 文件也不难,一步步来,先用unzOpen()
打开,unzGoToFirstFile()
、unzOpenCurrentFile()
配合着走,一次读一个文件出来:
if (unzGoToFirstFile(zip_file) == UNZ_OK) {
do {
char filename[256];
unzGetCurrentFileInfo(zip_file, NULL, filename, sizeof(filename), NULL, 0);
FILE* out_file = fopen(filename, "wb");
if (out_file != NULL) {
void* buffer = malloc(BUFFER_SIZE);
int read_size;
while ((read_size = unzReadCurrentFile(zip_file, buffer, BUFFER_SIZE)) > 0) {
fwrite(buffer, read_size, 1, out_file);
}
free(buffer);
fclose(out_file);
}
} while (unzGoToNextFile(zip_file) == UNZ_OK);
}
unzClose(zip_file);
这些 API 用起来其实还挺顺,逻辑也清晰。如果你项目里要搞压缩或解压功能,ZLib + minizip基本就能搞定。要注意释放资源,尤其是文件指针和内存分配。
如果你搞 iOS 项目,也可以看看这个基于 minizip 的 iOS 解压,挺有参考价值的。
233.1KB
文件大小:
评论区