ToB企服应用市场:ToB评测及商务社交产业平台

标题: C++ MiniZip实现目录压缩与解压 [打印本页]

作者: 王海鱼    时间: 2024-1-6 01:20
标题: C++ MiniZip实现目录压缩与解压
Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效、轻量级的压缩库,其被广泛应用于许多领域,包括网络通信、文件压缩、数据库系统等。其压缩算法是基于DEFLATE算法,这是一种无损数据压缩算法,通常能够提供相当高的压缩比。
在Zlib项目中的contrib目录下有一个minizip子项目,minizip实际上不是zlib库的一部分,而是一个独立的开源库,用于处理ZIP压缩文件格式。它提供了对ZIP文件的创建和解压的简单接口。minizip在很多情况下与zlib一起使用,因为ZIP压缩通常使用了DEFLATE压缩算法。通过对minizip库的二次封装则可实现针对目录的压缩与解压功能。

如果你想使用minizip通常你需要下载并编译它,然后将其链接到你的项目中。
编译Zlib库很简单,解压文件并进入到\zlib-1.3\contrib\vstudio目录下,根据自己编译器版本选择不同的目录,这里我选择vc12,进入后打开zlibvc.sln等待生成即可。

成功后可获得两个文件分别是zlibstat.lib和zlibwapi.lib如下图;

接着配置引用目录,这里需要多配置一个minizip头文件,该头文件是zlib里面的一个子项目。

lib库则需要包含zlibstat.lib和zlibwapi.lib这两个文件,此处读者可以自行放入到一个目录下;

ZIP 递归压缩目录

如下所示代码是一个使用zlib库实现的简单文件夹压缩工具的C++程序。该程序提供了压缩文件夹到 ZIP 文件的功能,支持递归地添加文件和子文件夹,利用了 Windows API 和 zlib 库的函数。
[code]#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[MAX_PATH] = { 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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4