C++解压库bit7z编译以及使用
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编译以及使用相关推荐
- 实验图文详解——apache的编译安装及httpd服务开机自启
实验图文详解--apache的编译安装及httpd服务开机自启 1.导入安装包 2.解压安装包 3.分别解压httpd.apr.apr-util包 4.对apr.apr-util目录进行移动及重命名操 ...
- apktool 反编译 java_APK文件使用ApkTool解包反编译和重新打包及签名
前段使用一直使用一个手机APK软件,不过最近软件更新,出现了一个很讨厌的语音提示,于是想通过重新编译把语音提示去掉. [准备工作] 配置JAVA环境,到http://www.java.com/下载并进 ...
- APK文件使用ApkTool解包反编译和重新打包及签名
前段使用一直使用一个手机APK软件,不过最近软件更新,出现了一个很讨厌的语音提示,于是想通过重新编译把语音提示去掉. [准备工作] 配置JAVA环境,到http://www.java.com/下载并进 ...
- 微信小程序渗透测试技巧-小程序解包-反编译
微信小程序渗透测试技巧-小程序解包-反编译 简述 安装手机模拟器,比如说夜神.MuMu 下载和安装两个应用,微信和RE文件管理器 获取root权限 打开微信,搜索相对应的小程序,然后再打开RE文件管理 ...
- xvid 详解 代码分析 编译等
1. Xvid参数详解 众所周知,Mencoder以其极高的压缩速率和不错的画质赢得了很多朋友的认同! 原来用Mencoder压缩Xvid的AVI都是使用Xvid编码器的默认设置,现在我来给大家冲 ...
- 微信短信显示服务器解包异常,最新微信小程序解包反编译bug处理 解决 $gwx is not defined 错误...
前期准备: 安装node.js不作细述,按提示安装即可.安装完成后在命令窗口输入:node -v,能查看到版本号即可. 打开脚本地址下载反编译脚本,解压. 安装依赖 在脚本目录下shift+鼠标右键, ...
- 硬实时RTLinux安装配置详解 (二):编译运行RTLinux
硬实时RTlinux系统配置 4. 配置RTLinux 4.1 配置Patch 4.2 配置RTLinux内核 4.3. 编译Rtlinux内核 4.4 制作initramfs启动引导: 5. 大功告 ...
- linux下编译zip,C++中ZipArchive压缩与解压的编译安装与使用
C++使用ZipArchive在linux中进行压缩,这方面网上的资料比较少,特别对于新手说,我是在windows中用vs2017新建linux工程,然后配置远程Linux服务器进行编译,下分步进行说 ...
- linux内核编译 menuconfig详解,Linux内核编译menuconfig介绍
menuconfig menuconfig是常用的配制工具,不用特意安装,好像是和GCC一起装上的. 注:menuconfig要用到ncurses的库,所以要安装它.下面的命令可以安装. apt-ge ...
最新文章
- ArrayList集合为什么不能使用foreach增加、删除、修改元素
- 百度Apollo无人车能力降维释放,打造智能汽车现在可以像拼乐高
- 华为ap配置_第18期——AP安装常见问题和注意事项
- js中console在一行内打印字符串和对象
- Spring——Spring工具类
- php里面电话验证码,PHP的中问验证码
- 排序算法之交换排序(冒泡排序、快速排序)
- python调用java文件_Python程序中调用Java代码的实践
- 托管项目到github
- 2020公务员考试应届毕业生的身份界定
- ESXI安装部署主机
- SnapGene快速入门,界面及常用操作教程
- 页面导航-声明式/编程式导航
- 移植u-boot到stm32f407
- SMAA算法详解 - SMAADetectVerticalCornerPattern
- Gvim中实现特定行文本的替换
- 移动硬盘突然在电脑上无法显示
- c语言用数字代表字母,使用c语言判断数字字母
- php中文数组按拼音排序问题
- Docker学习总结(46)——生产环境中遇到的Docker常见异常错误总结