C++ MiniZip实现目录压缩与解压

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表