在使用zlib、minizip和libzip过程中,遇到了一些问题和挑战,下面将对这些问题进行详细的描述和解决方案。
首先,需要明确三个组件:zlib、minizip和libzip。zlib是一个底层的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件。但是,如果需要压缩文件夹,则会变得复杂,因为不清楚如何在zip文件内部形成对应的目录结构。这时就需要使用更高级别的库,即minizip或libzip。
其次,minizip和libzip的接口在不同版本中一直在变化。使用人工智能进行查询时,得到的代码通常存在函数接口不匹配、参数错误等问题。因此,在遇到这种情况时,最好的解决方法是立即查阅官方文档,而不是依赖人工智能的答案。
另外,minizip和libzip都是基于zlib实现的。在使用过程中,发现libzip的接口设计更加清晰,官方文档也更为完善。
对于压缩文件夹的功能,需要借助于操作文件系统的库来组织zip内部的归档目录。在这里,我使用了C++17的std::filesystem库。
下面是具体的代码实现:
(以下为代码部分,未做修改)
关于使用libzip,有以下几点需要注意:
1. libzip压缩的zip内部的文件名默认采用UTF-8编码。
2. libzip要求使用正斜杠 (‘/’) 作为目录分隔符。
3. libzip操作不同的zip线程安全,操作同一个zip线程不安全。
4. zip_source_buffer这个函数的接口的第四个参数如果非0,会自动托管申请的资源。官方文档提到需要保证传入zip_source_buffer的数据资源需要保证跟zip_source_t一样的声明周期,但是笔者经过测试,正确的行为应该是传入zip_source_buffer的数据资源需要保证调用zip_close之前都有效,否则就有问题。