C++ MiniZip实现目录压缩与解压
Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效、轻量级的压缩库,其被广泛应用于许多领域,包括网络通信、文件压缩、数据库系统等。其压缩算法是基于DEFLATE算法,这是一种无损数据压缩算法,通常能够提供相当高的压缩比。在Zlib项目中的contrib目录下有一个minizip子项目,minizip实际上不是zlib库的一部分,而是一个独立的开源库,用于处理ZIP压缩文件格式。它提供了对ZIP文件的创建和解压的简单接口。minizip在很多情况下与zlib一起使用,因为ZIP压缩通常使用了DEFLATE压缩算法。通过对minizip库的二次封装则可实现针对目录的压缩与解压功能。
https://img2023.cnblogs.com/blog/1379525/202311/1379525-20231122164633603-1690716901.png
如果你想使用minizip通常你需要下载并编译它,然后将其链接到你的项目中。
[*]Zlib源码:https://download.csdn.net/download/lyshark_csdn/88561117
编译Zlib库很简单,解压文件并进入到\zlib-1.3\contrib\vstudio目录下,根据自己编译器版本选择不同的目录,这里我选择vc12,进入后打开zlibvc.sln等待生成即可。
https://img2023.cnblogs.com/blog/1379525/202311/1379525-20231122154058406-1922870225.png
成功后可获得两个文件分别是zlibstat.lib和zlibwapi.lib如下图;
https://img2023.cnblogs.com/blog/1379525/202311/1379525-20231122154205077-1316747205.png
接着配置引用目录,这里需要多配置一个minizip头文件,该头文件是zlib里面的一个子项目。
https://img2023.cnblogs.com/blog/1379525/202311/1379525-20231122154848352-1454099180.png
lib库则需要包含zlibstat.lib和zlibwapi.lib这两个文件,此处读者可以自行放入到一个目录下;
https://img2023.cnblogs.com/blog/1379525/202311/1379525-20231122155013216-2016308765.png
ZIP 递归压缩目录
如下所示代码是一个使用zlib库实现的简单文件夹压缩工具的C++程序。该程序提供了压缩文件夹到 ZIP 文件的功能,支持递归地添加文件和子文件夹,利用了 Windows API 和 zlib 库的函数。
#define ZLIB_WINAPI#include #include #include #include#include #include #include using namespace std;#pragma comment(lib, "Shlwapi.lib")#pragma comment(lib, "zlibstat.lib")bool nyAddfiletoZip(zipFile zfile, const std::string& fileNameinZip, const std::string& srcfile){// 目录如果为空则直接返回if (NULL == zfile || fileNameinZip.empty()){ return 0;}int nErr = 0;zip_fileinfo zinfo = { 0 };tm_zip tmz = { 0 };zinfo.tmz_date = tmz;zinfo.dosDate = 0;zinfo.internal_fa = 0;zinfo.external_fa = 0;char sznewfileName = { 0 };memset(sznewfileName, 0x00, sizeof(sznewfileName));strcat_s(sznewfileName, fileNameinZip.c_str());if (srcfile.empty()){ strcat_s(sznewfileName, "\\");}nErr = zipOpenNewFileInZip(zfile, sznewfileName, &zinfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);if (nErr != ZIP_OK){ return false;}if (!srcfile.empty()){ // 打开源文件 FILE* srcfp = _fsopen(srcfile.c_str(), "rb", _SH_DENYNO); if (NULL == srcfp) { std::cout
页:
[1]