使用libzip压缩文件和文件夹
简单说说自己遇到的坑:[*]分清楚三个组件:zlib、minizip和libzip。zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主要是不知道如何归档,在zip内部形成对应的目录。这时就需要用更高级别的库,也就是minizip或libzip。
[*]minizip、libzip随着版本迭代接口一直变化,我连续使用了通义千问、文心一言、gemini三个AI,基本上没给出能使用的代码,主要是函数接口总是不对,或者参数多了或者少了。像这种情况就不要再参考AI给出的答案了,赶紧翻官方文档才是正经。
[*]minizip和libzip都是基于zlib实现的,都尝试使用过,感觉还是libzip的接口设计更清晰一点,官方文档说明也还不错。
[*]压缩文件夹的功能需要借助于操作文件系统的库来组织zip内部的归档目录,我这里使用的是C++17的std::filesystem。
具体代码实现如下:
#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
页:
[1]