ZLib+minizip实现ZIP压缩解压

文件压缩的老搭档,ZLibminizip,真的挺好用。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 解压,挺有参考价值的。

zip 文件大小:233.1KB