简单说说自己遇到的坑:
- 分清楚三个组件: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 |