当前位置: 首页 > news >正文

Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(一)

bit7z一个c++静态库,为7-zip共享库提供了一个干净简单的接口
使用CMAKE重新编译github上的bit7z库,用来解压/预览iso9660WImZip,Rar等常用的压缩文件格式。z-zip库支持大多数压缩文件格式

导读

    • 编译bit7z(C++版本)
      • 使用mscv 2017编译器编译
      • 参考借鉴文章
    • 下载bit7z(QT版本)
    • 调用bit7z库
    • 调用库(hotfix/v3.1.4/示例)
      • 解压文件
      • 压缩文件
      • 查看文件详细
    • 调用库可执行程序示例

编译bit7z(C++版本)

bit7z是一个跨平台的c++静态库,它允许通过一个干净简单的包装器接口从7-zip项目压缩/提取归档文件到动态库。
它支持对文件系统或内存进行压缩和提取、读取存档元数据、更新现有的存档元数据、创建多卷存档、操作进度回调以及许多其他功能。
压缩支持格式:7z, XZ, BZIP2, GZIP, TAR, ZIP, and WIM.
解压支持格式:7z, AR, ARJ, BZIP2, CAB, CHM, CPIO, CramFS, DEB, DMG, EXT, FAT, GPT, GZIP, HFS, HXS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RAR5, RPM, SquashFS, TAR, UDF, UEFI, VDI, VHD, VMDK, WIM, XAR, XZ, Z, and ZIP
更多详细:https://github.com/rikyoz/bit7z
不建议使用此版本调用7-zip库;

使用mscv 2017编译器编译

从https://github.com/rikyoz/bit7z下载源码后解压使用cMake默认mscv2017直接可以编译,选项直接默认或者全选就行,然后再点击 Configure-》generate;
在这里插入图片描述
编译后生成以下目录
在这里插入图片描述
此时需要返回bit7z-master原目录添加lamz1900
在这里插入图片描述
下载lamz1900包:https://www.7-zip.org/a/lzma1900.7z
解压lzma1900,将lzma1900中的文件复制到bit7z-master包下的third_party/7-zip文件夹中
在这里插入图片描述
打开编译好的bit7z.sln文件修改设置bit7z为启动项,修改属性页-》c/C++附件目录中的库文件目录,然后右键重新生成,在生成目录下找到生成好的bit7z.lib文件
在这里插入图片描述
通过这种方法生成lib库,BitCompressor 类变成了一个模版类,调用方式参考github的后半段说明,比较繁琐,源码中展示的案例也貌似是付费内容,需要三方库。
建议直接通过编译下载Qt版本bit7z库调用

参考借鉴文章

C++ 7z解压缩编译及使用
c++配置并使用bit7z加密压缩或解压7z文件
bit7z库 :https://github.com/rikyoz/bit7z

下载bit7z(QT版本)

直接下载Qt版本的bit7z库,能直接重新选择编译器生成Bit7z
主要是参考这篇文章:
qt5 7zip源码编译及使用(含展示进度)
解压后直接可以打开bit7z.pro ,
在这里插入图片描述
同时也需要把lzma1900中的文件放到7zsdk文件夹中,再选择编译器编译就行。
在这里插入图片描述

调用bit7z库

以Qt版本源码生成的bit7z库为例,需要在项目pro文件中添加lib引用和include文件夹引用

///生成的lib库地址
win32:CONFIG(release, debug|release): LIBS += -L$$DESTDIR/ -lbit7z
else:win32:CONFIG(debug, debug|release): LIBS += -L$$DESTDIR/ -lbit7zd#include文件目录所在 包括所有hpp头文件
INCLUDEPATH += $$PWD/../bit7z
DEPENDPATH += $$PWD/../bit7z

注意调用时需要OleAut32.lib和User32.lib这两个文件,

# 不加上-lOleAut32 -lUser32这段 bit7z无法解析 
LIBS += -L$$DESTDIR -lbit7z -lOleAut32 -lUser32

编译时最好在bitformat.hpp文件中添加此宏定义,

//使用此宏定义调用时只需要使用 BitFormat::Auto
//不用再判断文件类型
#define BIT7Z_AUTO_FORMAT

在这里插入图片描述

和bit7z.lib文件放在同一目录下。
参考:
qt5 7zip源码编译及使用(含展示进度)
https://gitcode.net/mirrors/rikyoz/Bit7z/-/tree/hotfix/v3.1.4

至于需要的7-zip库:
7z.dll可以通过官网:7-Zip -程序下载安装后获取。
在这里插入图片描述
7za.dll和7zxa.dll可以直接下载:https://www.7-zip.org/a/7z1900-extra.7z解压获取
建议7za.dll和7zxa.dll和7z.dll和执行程序放同一目录下
其中:
7z.dll应该支持所有功能,而7za.dll应该只支持7z文件格式,而7zxa.dll只能提取7z文件
在这里插入图片描述

the 7z.dll should support all these features, while 7za.dll should support only the 7z file format and the 7zxa.dll can only extract 7z files. For more information about the 7-zip DLLs, please see this wiki page

编译出现异常可以参考:[笔记] 编译bit7z踩坑记录

调用库(hotfix/v3.1.4/示例)

解压文件

#include "bitextractor.hpp"using namespace  bit7z;try {Bit7zLibrary lib{ L"7za.dll" };//启用宏定义BIT7Z_AUTO_FORMAT后可以直接使用BitFormat::AutoBitExtractor extractor{ lib, BitFormat::SevenZip };extractor.extract( L"path/to/archive.7z", L"out/dir/" ); //extracting a simple archiveextractor.extractMatching( L"path/to/arc.7z", L"file.pdf", L"out/dir/" ); //extracting a specific file//extracting the first file of an archive to a bufferstd::vector< byte_t > buffer;extractor.extract( L"path/to/archive.7z", buffer );//extracting an encrypted archiveextractor.setPassword( L"password" );extractor.extract( L"path/to/another/archive.7z", L"out/dir/" );
} catch ( const BitException& ex ) {//do something with ex.what()...
}

压缩文件

#include "bitcompressor.hpp"using namespace bit7z;try {Bit7zLibrary lib{ L"7z.dll" };//启用宏定义BIT7Z_AUTO_FORMAT后可以直接使用BitFormat::AutoBitCompressor compressor{ lib, BitFormat::Zip };std::vector< std::wstring > files = { L"path/to/file1.jpg", L"path/to/file2.pdf" };compressor.compress( files, L"output_archive.zip" ); //creating a simple zip archive//creating a zip archive with a custom directory structurestd::map< std::wstring, std::wstring > files_map = { { L"path/to/file1.jpg", L"alias/path/file1.jpg" },{ L"path/to/file2.pdf", L"alias/path/file2.pdf" } };compressor.compress( files_map, L"output_archive2.zip" );compressor.compressDirectory( L"dir/path/", L"dir_archive.zip" ); //compressing a directory//creating an encrypted zip archive of two filescompressor.setPassword( L"password" );compressor.compressFiles( files, L"protected_archive.zip" );//updating an existing zip archivecompressor.setUpdateMode( true );compressor.compressFiles( files, L"existing_archive.zip" );//compressing a single file into a bufferstd::vector< byte_t > buffer;BitCompressor compressor2{ lib, BitFormat::BZip2 };compressor2.compressFile( files[0], buffer );
} catch ( const BitException& ex ) {//do something with ex.what()...
}

查看文件详细

可以通过此方法直接预览压缩文件夹内容

#include "bitarchiveinfo.hpp"using namespace bit7z;try {Bit7zLibrary lib{ L"7za.dll" };BitArchiveInfo arc{ lib, L"archive.7z", BitFormat::SevenZip };//printing archive metadatawcout << L"Archive properties" << endl;wcout << L" Items count: "   << arc.itemsCount() << endl;wcout << L" Folders count: " << arc.foldersCount() << endl;wcout << L" Files count: "   << arc.filesCount() << endl;wcout << L" Size: "          << arc.size() << endl;wcout << L" Packed size: "   << arc.packSize() << endl;wcout << endl;//printing archive items metadatawcout << L"Archive items";auto arc_items = arc.items();for ( auto& item : arc_items ) {wcout << endl;wcout << L" Item index: "   << item.index() << endl;wcout << L"  Name: "        << item.name() << endl;wcout << L"  Extension: "   << item.extension() << endl;wcout << L"  Path: "        << item.path() << endl;wcout << L"  IsDir: "       << item.isDir() << endl;wcout << L"  Size: "        << item.size() << endl;wcout << L"  Packed size: " << item.packSize() << endl;}
} catch ( const BitException& ex ) {//do something with ex.what()...
}

调用库可执行程序示例

Qt调用Bit7z库接口调用7z.dll解压压缩常用Zip、ISO9660、Wim、7z等格式的可执行程序,非源码!Qt案例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(一)

bit7z一个c静态库&#xff0c;为7-zip共享库提供了一个干净简单的接口 使用CMAKE重新编译github上的bit7z库&#xff0c;用来解压/预览iso9660&#xff0c;WIm&#xff0c;Zip,Rar等常用的压缩文件格式。z-zip库支持大多数压缩文件格式 导读 编译bit7z(C版本)使用mscv 2017编译…...

AndroidUI体系

见&#xff1a;GitHub - eHackyd/Android_UI: Android UI体系的学习笔记...

CBV (基于类的视图)源码解析(1)

面向对象和反射的一些补充说明 class Animal:def __init__(self, name, age, func_str):self.name nameself.age age# self 指的是类实例对象&#xff0c;此处指的是 Dog 的实例对象# 所以如果 Dog 中重写了 sleep 方法&#xff0c;那么 self.sleep() 调用的就是 Dog 中的 s…...

2023-08-17 Untiy进阶 C#知识补充7——C#8主要功能与语法

文章目录 一、Using 声明二、静态本地函数三、Null 合并赋值四、解构函数 Deconstruct五、模式匹配增强功能 ​ 注意&#xff1a;在此仅提及 Unity 开发中会用到的一些功能和特性&#xff0c;对于不适合在 Unity 中使用的内容会忽略。 ​ C# 8 对应 Unity 版本&#xff1a; Un…...

登陆接口的的Filter过滤

目录 一、概述 二、基本操作 三、登陆检查接口 一、概述 什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能 使用了过滤器之后&#xff0…...

【Python原创设计】基于Python Flask的全国气象数据采集及可视化系统-附下载方式以及项目参考论文,原创项目其他均为抄袭

基于Python Flask的全国气象数据采集及可视化系统 一、项目简介二、项目技术三、项目功能四、运行截图五、分类说明六、实现代码七、数据库结构八、源码下载 一、项目简介 本项目是一个基于Web技术的实时气象数据可视化系统。通过爬取中国天气网的各个城市气象数据&#xff0c…...

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 目录 【力扣】42. 接雨水题解暴力双指针单调栈 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…...

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现&#xff1a;单向链表&#xff1a;实现&#xff1a;双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中&#xff0c;我们知道线性表【一种数据组织、在内存中存储的形式】…...

关于openfeign调用时content-type的问题

问题1描述&#xff1a; 今天在A服务使用openfeign调用B服务的时候&#xff0c;发现经常会偶发性报错。错误如下&#xff1a; 情况为偶发&#xff0c;很让人头疼。 两个接口如下&#xff1a; A服务接口&#xff1a; delayReasonApi.test(student);就是使用openfeign调用B服务的…...

OpenCV 玩转图像和视频

为什么学OpenCV&#xff1f; • OpenCV ⽀持对图像缩放、旋转、绘制⽂字图形等基础操作 • OpenCV 库包含了很多计算机视觉领域常⻅算法&#xff1a;⽬标检测、⽬标跟踪等 OpenCV 简介 • OpenCV (Open Source Computer Vision) 是计算机视觉和机器学习软件库 • Intel 1999…...

技术分享 | 如何编写同时兼容 Vue2 和 Vue3 的代码?

LigaAI 的评论编辑器、附件展示以及富文本编辑器都支持在 Vue2&#xff08;Web&#xff09;与 Vue3&#xff08;VSCode、lDEA&#xff09;中使用。这样不仅可以在不同 Vue 版本的工程中间共享代码&#xff0c;还能为后续升级 Vue3 减少一定阻碍。 那么&#xff0c;同时兼容 Vue…...

基于ArcGis提取道路中心线

基于ArcGis提取道路中心线 文章目录 基于ArcGis提取道路中心线前言一、生成缓冲区二、导出栅格数据三、导入栅格数据四、新建中心线要素五、生成中心线总结 前言 最近遇到一个问题&#xff0c;根据道路SHP数据生成模型的时候由于下载的道路数据杂项数据很多&#xff0c;所以导…...

xcode14.3更新一系列问题

1. Missing file libarclite_iphoneos.a (Xcode 14.3) 解决方法 Xcode升级到14.3后编译失败&#xff0c;完整错误日志&#xff1a; File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneo…...

1U和2U的服务器怎么选择

企业建设网站的过程中&#xff0c;离不开租用服务器的环节&#xff0c;服务器在多种场景里面都可以发挥作用&#xff0c;服务器租用渠道有哪些&#xff1f;1U、2U选哪种服务器比较好&#xff1f;大家跟着壹基比小鑫一起来了解具体内容吧&#xff01; 1U、2U选哪种服务器比较好&…...

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码)

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码) 一、APPS PBL(Application Primary Boot Loader):固化在CPU ROM中1.1 APPS PBL 加载 XBL Loader1.2 XBL Loader加载验证并运行SMSS进行自检,自检完成后触发Warm Reset1.3 WarmRest后,APPS…...

【数据结构与算法】迪杰斯特拉算法

迪杰斯特拉算法 介绍 迪杰斯特拉&#xff08;Dijkstra&#xff09;算法是典型最短路径算法&#xff0c;用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展&#xff08;广度优先搜索思想&#xff09;&#xff0c;直到扩展到终点为止。 算法过程 设置…...

python爬虫-网页数据提取

import requests #headers 网页右键->Network->最下面的User-Agent复制。 headers {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"} #你想要的网址 url &q…...

ZigBee的Many-to-One和Source Routing

1. Many-to-One Routing Many-to-One Routing&#xff0c;是一种简单的路由机制&#xff0c;使得整个网络中的路由设备拥有回到中心节点的路由。 在这种机制下&#xff0c;中心节点周期性发送Many-to-One route discovery广播&#xff08;协议栈默认设置为60s&#xff0c;可以…...

七夕节 Chinese Valentine‘s Day 的由来

农历七月初七是七夕节。Qixi Festival falls on the seventh day of the seventh lunar month. 以前有一个牛郎&#xff0c;和他的哥哥和嫂子住在一起。他放的一头牛曾经是天庭的一个神仙&#xff0c;但他违反天庭的戒律&#xff0c;变成牛放到了人间。As the story goes,once …...

掌握JDK21全新结构化并发编程,轻松提升开发效率!

1 概要 通过引入结构化并发编程的API&#xff0c;简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元&#xff0c;从而简化错误处理和取消操作&#xff0c;提高可靠性&#xff0c;并增强可观察性。这是一个预览版的API。 2 历史 结构化并发是由JEP 42…...

【限时公开】ElevenLabs企业级有声书工作台搭建指南:Webhook自动触发+Notion项目看板+音频质量AI评分模型(含开源评估脚本)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs企业级有声书工作台全景概览 ElevenLabs 企业级有声书工作台&#xff08;Enterprise Audiobook Studio&#xff09;是一套面向出版机构、教育平台与内容工厂的端到端语音生成协同平台&#x…...

智慧校园平台建设要多少钱?这份预算规划指南帮你理清思路

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

SM3国密算法实战:从原理到Java代码实现与数据完整性校验

1. SM3国密算法&#xff1a;你的数据安全守门人 第一次听说SM3算法时&#xff0c;我正在处理一个政府项目的投标文件加密需求。客户明确要求必须使用国密标准算法&#xff0c;当时我对这类算法还停留在"听说过但没用过"的阶段。经过两周的实战摸索&#xff0c;我发现…...

VSCode + GitLab 真香组合:告别命令行恐惧,可视化搞定团队代码提交与合并

VSCode GitLab 可视化协作指南&#xff1a;零命令行完成高效团队开发 对于视觉型开发者而言&#xff0c;命令行操作常常是学习Git工作流的最大障碍。当团队采用GitLab进行协作时&#xff0c;传统教程中频繁出现的git checkout、git rebase等命令更容易让人望而生畏。事实上&a…...

探索APK Installer:如何用Windows原生技术解析安装安卓应用?

探索APK Installer&#xff1a;如何用Windows原生技术解析安装安卓应用&#xff1f; 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows上安装安卓应用而烦恼…...

终极指南:如何使用Pinpoint深度监控Spring Cloud Alibaba Sentinel熔断降级机制 [特殊字符]

终极指南&#xff1a;如何使用Pinpoint深度监控Spring Cloud Alibaba Sentinel熔断降级机制 &#x1f680; 【免费下载链接】pinpoint APM, (Application Performance Management) tool for large-scale distributed systems. 项目地址: https://gitcode.com/gh_mirrors/pi/…...

Python调用MATLAB引擎避坑指南:从安装路径选择到`setup.py` install命令的完整实战

Python调用MATLAB引擎避坑指南&#xff1a;从安装路径选择到setup.py install命令的完整实战 在科学计算和工程仿真领域&#xff0c;MATLAB和Python各有优势。许多开发者希望将两者结合使用&#xff0c;但安装MATLAB引擎到Python环境时常常遇到各种"玄学"问题。本文将…...

WinForm弹窗进阶:手把手教你封装一个通用的MessageBoxHelper工具类(.NET Framework/C#)

WinForm弹窗进阶&#xff1a;打造高复用性的MessageBoxHelper工具类 在WinForm开发中&#xff0c;MessageBox.Show()就像空气一样无处不在——从简单的操作确认到复杂的错误处理&#xff0c;这个基础组件承担了太多交互职责。但当你第20次写下MessageBox.Show("操作成功&q…...

时序电路的心脏:钟控触发器(RS/D/JK/T)原理与应用全解析

1. 时序电路的心脏&#xff1a;为什么需要钟控触发器&#xff1f; 第一次接触数字电路时&#xff0c;我被各种触发器绕得头晕。直到老师用"心脏"来比喻钟控触发器&#xff0c;才恍然大悟——就像心脏通过规律跳动为全身供血一样&#xff0c;钟控触发器通过时钟脉冲协…...

【源码深度】Android 屏幕渲染底层原理|SurfaceFlinger + 渲染流水线 + 刷新率适配 + 帧率卡顿根治|Android 全栈体系 150 讲 - 42

...