利用libzip压缩文件和文件夹

打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

简单说说自己遇到的坑:

  • 分清楚三个组件:zlib、minizip和libzip。zlib是底层和最基础的C库,用于利用Deflate算法压缩息争压缩文件流大概单个文件,但是如果要压缩文件夹就很麻烦,主要是不知道如何归档,在zip内部形成对应的目次。这时就必要用更高级别的库,也就是minizip或libzip。
  • minizip、libzip随着版本迭代接口一直变化,我连续利用了通义千问、文心一言、gemini三个AI,基本上没给出能利用的代码,主要是函数接口总是不对,大概参数多了大概少了。像这种环境就不要再参考AI给出的答案了,赶紧翻官方文档才是正经。
  • minizip和libzip都是基于zlib实现的,都尝试利用过,感觉还是libzip的接口计划更清晰一点,官方文档说明也还不错。
  • 压缩文件夹的功能必要借助于操纵文件系统的库来组织zip内部的归档目次,我这里利用的是C++17的std::filesystem。
具体代码实现如下:
[code]#include #include #include #include using namespace std;void CompressFile2Zip(std::filesystem::path unZipFilePath,                      const char* relativeName, zip_t* zipArchive) {  std::ifstream file(unZipFilePath, std::ios::binary);  file.seekg(0, std::ios::end);  size_t bufferSize = file.tellg();  char* bufferData = (char*)malloc(bufferSize);  file.seekg(0, std::ios::beg);  file.read(bufferData, bufferSize);  //第四个参数如果非0,会自动托管申请的资源,直到zip_close之前自动烧毁。  zip_source_t* source =      zip_source_buffer(zipArchive, bufferData, bufferSize, 1);  if (source) {    if (zip_file_add(zipArchive, relativeName, source, ZIP_FL_OVERWRITE) < 0) {      std::cerr
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表