1.编译bit7z库

bit7z是一个C++静态库,其封装了简单易用的接口,用于调用7-zip库;编译该库,首先需要下载以下源码:

  • 下载bit7z:https://github.com/rikyoz/bit7z
  • 下载lzma:https://jaist.dl.sourceforge.net/project/sevenzip/LZMA SDK/lzma1805.7z

解压bit7z、lzma;在编译之前,需要将lzma解压出来的文件放在bit7z的lib\7zSDK目录下,如下图所示:
接下来就可以使用VS打开bit7z.vcxproj进行编译了,编译结果会产生两个静态库bit7z.lib、bit7z_d.lib,此时我们就可以在程序用调用该库了。由于bit7z依赖7z库,所以还需要下载7z的dll方可正常运行

  • 7za.dll:下载链接
  • 7z.dll:下载链接

2.使用示例

封装ZipHelper类如下:
头文件

#pragma once
#ifndef NIMO_OBS_ZLIB_H
#define NIMO_OBS_ZLIB_H
#include <iostream>
#include <string>
#include <functional>
#include "bit7z.hpp"
#include "bit7zlibrary.hpp"class ZlibHelper {
private:std::string msSourcePath;std::string msDestDir;uint64_t mSize;typedef std::function<void(double process)> UnZipProcessCallback;typedef std::function<void(std::string filename)> UnZipFileCallback;UnZipProcessCallback upc;UnZipFileCallback ufc;
public:ZlibHelper(std::string src, std::string dest); ~ZlibHelper();void Extract();                                         // 解压void SetUnZipProcessCallback(UnZipProcessCallback upc);void SetUnZipFileCallback(UnZipFileCallback ufc);
private:void GetSizeOfZipPackage();void ProcessCallback(uint64_t size);void FileCallback(std::wstring filename);
};
#endif

源文件

#include "Zlib.h"
//----------------------------------------------------------------------------
ZlibHelper::ZlibHelper(std::string src, std::string dest) : upc(nullptr), ufc(nullptr)
{msSourcePath = src;msDestDir = dest;GetSizeOfZipPackage();
}
//----------------------------------------------------------------------------
ZlibHelper::~ZlibHelper()
{
}
//----------------------------------------------------------------------------
// 获取Zip包的大小
void ZlibHelper::GetSizeOfZipPackage()
{std::wstring src = StringUtil::StringToWString(msSourcePath.c_str());bit7z::Bit7zLibrary lib(L"7z.dll");bit7z::BitArchiveInfo info(lib, src, bit7z::BitFormat::Zip);mSize = info.size();
}
//----------------------------------------------------------------------------
void ZlibHelper::ProcessCallback(uint64_t size)
{double process = ((1.0 * size) / mSize);//std::wcout << process << "%" << std::endl;if (upc) {upc(process);}
}
//----------------------------------------------------------------------------
void ZlibHelper::FileCallback(std::wstring filename)
{std::string temp = StringUtil::WStringToString(filename.c_str());//std::cout << temp.c_str() << std::endl;if (ufc) {ufc(temp);}
}
//----------------------------------------------------------------------------
// 解压
void ZlibHelper::Extract()
{bit7z::Bit7zLibrary lib(L"7z.dll");bit7z::BitExtractor extractor(lib, bit7z::BitFormat::Zip);bit7z::ProgressCallback pc = std::bind(&ZlibHelper::ProcessCallback, this, std::placeholders::_1);bit7z::FileCallback fc = std::bind(&ZlibHelper::FileCallback, this, std::placeholders::_1);extractor.setProgressCallback(pc);extractor.setFileCallback(fc);std::wstring src = StringUtil::StringToWString(msSourcePath.c_str());std::wstring dest = StringUtil::StringToWString(msDestDir.c_str());extractor.extract(src, dest);
}
//----------------------------------------------------------------------------
void ZlibHelper::SetUnZipProcessCallback(UnZipProcessCallback upc)
{this->upc = upc;
}
//----------------------------------------------------------------------------
void ZlibHelper::SetUnZipFileCallback(UnZipFileCallback ufc)
{this->ufc = ufc;
}

调用

ZlibHelper* pUnzip = new ZlibHelper("2.zip", "output");
pUnzip->SetUnZipProcessCallback(std::bind(&CustomInstalWndViewCtrl::ProcessCallback, this, std::placeholders::_1));
pUnZip->Extract();

调用可以输出解压文件信息和百分比:

C++解压库bit7z编译以及使用相关推荐

  1. 实验图文详解——apache的编译安装及httpd服务开机自启

    实验图文详解--apache的编译安装及httpd服务开机自启 1.导入安装包 2.解压安装包 3.分别解压httpd.apr.apr-util包 4.对apr.apr-util目录进行移动及重命名操 ...

  2. apktool 反编译 java_APK文件使用ApkTool解包反编译和重新打包及签名

    前段使用一直使用一个手机APK软件,不过最近软件更新,出现了一个很讨厌的语音提示,于是想通过重新编译把语音提示去掉. [准备工作] 配置JAVA环境,到http://www.java.com/下载并进 ...

  3. APK文件使用ApkTool解包反编译和重新打包及签名

    前段使用一直使用一个手机APK软件,不过最近软件更新,出现了一个很讨厌的语音提示,于是想通过重新编译把语音提示去掉. [准备工作] 配置JAVA环境,到http://www.java.com/下载并进 ...

  4. 微信小程序渗透测试技巧-小程序解包-反编译

    微信小程序渗透测试技巧-小程序解包-反编译 简述 安装手机模拟器,比如说夜神.MuMu 下载和安装两个应用,微信和RE文件管理器 获取root权限 打开微信,搜索相对应的小程序,然后再打开RE文件管理 ...

  5. xvid 详解 代码分析 编译等

    1.   Xvid参数详解 众所周知,Mencoder以其极高的压缩速率和不错的画质赢得了很多朋友的认同! 原来用Mencoder压缩Xvid的AVI都是使用Xvid编码器的默认设置,现在我来给大家冲 ...

  6. 微信短信显示服务器解包异常,最新微信小程序解包反编译bug处理 解决 $gwx is not defined 错误...

    前期准备: 安装node.js不作细述,按提示安装即可.安装完成后在命令窗口输入:node -v,能查看到版本号即可. 打开脚本地址下载反编译脚本,解压. 安装依赖 在脚本目录下shift+鼠标右键, ...

  7. 硬实时RTLinux安装配置详解 (二):编译运行RTLinux

    硬实时RTlinux系统配置 4. 配置RTLinux 4.1 配置Patch 4.2 配置RTLinux内核 4.3. 编译Rtlinux内核 4.4 制作initramfs启动引导: 5. 大功告 ...

  8. linux下编译zip,C++中ZipArchive压缩与解压的编译安装与使用

    C++使用ZipArchive在linux中进行压缩,这方面网上的资料比较少,特别对于新手说,我是在windows中用vs2017新建linux工程,然后配置远程Linux服务器进行编译,下分步进行说 ...

  9. linux内核编译 menuconfig详解,Linux内核编译menuconfig介绍

    menuconfig menuconfig是常用的配制工具,不用特意安装,好像是和GCC一起装上的. 注:menuconfig要用到ncurses的库,所以要安装它.下面的命令可以安装. apt-ge ...

最新文章

  1. ArrayList集合为什么不能使用foreach增加、删除、修改元素
  2. 百度Apollo无人车能力降维释放,打造智能汽车现在可以像拼乐高
  3. 华为ap配置_第18期——AP安装常见问题和注意事项
  4. js中console在一行内打印字符串和对象
  5. Spring——Spring工具类
  6. php里面电话验证码,PHP的中问验证码
  7. 排序算法之交换排序(冒泡排序、快速排序)
  8. python调用java文件_Python程序中调用Java代码的实践
  9. 托管项目到github
  10. 2020公务员考试应届毕业生的身份界定
  11. ESXI安装部署主机
  12. SnapGene快速入门,界面及常用操作教程
  13. 页面导航-声明式/编程式导航
  14. 移植u-boot到stm32f407
  15. SMAA算法详解 - SMAADetectVerticalCornerPattern
  16. Gvim中实现特定行文本的替换
  17. 移动硬盘突然在电脑上无法显示
  18. c语言用数字代表字母,使用c语言判断数字字母
  19. php中文数组按拼音排序问题
  20. Docker学习总结(46)——生产环境中遇到的Docker常见异常错误总结

热门文章

  1. 使用某为开发板,在项目过程中遇到的坑,记录一下,希望以后不会遇到
  2. JavaWeb-JavaScript API
  3. Ajax+php上传图片
  4. 基于51单片机的旋转LED
  5. JAVA学习练习(扎金花与21点)
  6. SIT1040T,芯力特CAN接口芯片,参数描述,完美替代TJA1040
  7. sourcetree离线安装,免注册安装,跳过注册安装
  8. vue项目,svn提交代码时忽略node_modules文件夹提交。
  9. 数据中心机架与服务器,数据中心服务器机架是什么?如何选购?
  10. 深度玄学-实战开发步骤