Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(二)
修改qt5 7zip源码编译及使用(含展示进度)一文中的封装类ZlibHelper代码类,继承多线程,使解压,压缩时进度条不影响界面,同时添加压缩文件中的文件预览功能,建议直接看源码
导读
- 相关代码
- 内容扩展
- 预览内容时获取文件修改时间
- 预览内容时获取文件大小
相关代码
lib_bit7z.h 头文件代码
#ifndef LIB_BIT7Z_H
#define LIB_BIT7Z_H
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
#include "singleton.h"
#include <QDebug>
#include <QObject>
#include <QString>
#include <QFileInfo>
#include <QFile>
#include <QDir>
#include <QThread>
#include <iostream>
#include <string>
#include <functional>
#include <QMetaType>
#include "include/bit7z.hpp"
#include "include/bit7zlibrary.hpp"
using namespace bit7z;
using namespace std;enum Oper_Type{///解压Oper_Extract=-1,///压缩Oper_Compress=1
};class Lib_bit7z: public QThread
{Q_OBJECT
public:Lib_bit7z(Oper_Type _type);///初始化业务值void inits(QString _Zip,QString _Dir,QString _passWord){sZip=_Zip;sDir=_Dir;passWord=_passWord;}///lib所在路径wstring lib_path;void run() override;static wstring stringToWstring_WindowApi(const string &str);static string wstringToString_WindowsApi(const wstring &wstr);//预览static void Get_view(QString path);static vector<BitArchiveItem> Get_view_item(QString path,QString password);
signals:void sigProgress(uint64_t nValue, uint64_t nTotalSize);void sigProgressFile(QString sFile);void IsStart(bool isStart);void MessAgeError(QString);
private:/// 解压void extract(const QString& sZip, const QString& sDir);/// 压缩void compress(const QString& sDir, const QString& sZip);void callbackProcess(uint64_t size);void callbackFile(wstring filename);void callbackTotal(uint64_t size);private:uint64_t m_nTotalSize; // 压缩前文件夹原始大小///操作类型Oper_Type operation_type;QString sZip;QString sDir;QString passWord;
};#endif // LIB_BIT7Z_H
lib_bit7z.cpp头文件代码
#include "lib_bit7z.h"
#include <QMessageBox>
Lib_bit7z::Lib_bit7z(Oper_Type _type):operation_type(_type)
{lib_path=L"7z.dll";qRegisterMetaType<uint64_t>("uint64_t");}
//Lib_bit7z::~Lib_bit7z(){}void Lib_bit7z::run()
{emit IsStart(true);if(operation_type==Oper_Extract)extract(sZip, sDir);elsecompress(sDir, sZip);emit IsStart(false);
}void Lib_bit7z::Get_view(QString sZip)
{wstring wZip = stringToWstring_WindowApi(sZip.toLocal8Bit().toStdString());try {Bit7zLibrary lib{ L"7z.dll" };BitArchiveInfo arc{ lib, wZip, BitFormat::Auto };//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()...QMessageBox::warning(nullptr,"提示","预览失败! 原因: \n"+QString::fromStdString(ex.what()));}}vector<BitArchiveItem> Lib_bit7z::Get_view_item(QString sZip,QString password)
{wstring wZip = stringToWstring_WindowApi(sZip.toLocal8Bit().toStdString());vector<BitArchiveItem> items;try {Bit7zLibrary lib{ L"7z.dll" };BitArchiveInfo arc{ lib, wZip, BitFormat::Auto };if(password.trimmed()!=""){wstring wPassword = stringToWstring_WindowApi(password.toLocal8Bit().toStdString());arc.setPassword(wPassword);}items = arc.items();} catch ( const BitException& ex ) {//do something with ex.what()...QMessageBox::warning(nullptr,"提示","提取预览文件失败! 原因: \n"+QString::fromStdString(ex.what()));}return items;
}//----------------------------------------------------------------------------
void Lib_bit7z::callbackProcess(uint64_t size)
{double process = ((1.0 * size) / m_nTotalSize)*100;
// qDebug()<<QString("process -- %1 -->%2").arg(size).arg(QString::number(process,'f',2));if (m_nTotalSize == 0){return;}emit sigProgress(size, m_nTotalSize);
}//----------------------------------------------------------------------------
void Lib_bit7z::callbackFile(wstring filename)
{string temp = wstringToString_WindowsApi(filename.c_str());QString sContent = QString::fromLocal8Bit(temp.c_str());
// qDebug()<<QString("file --- %1").arg(sContent);emit sigProgressFile(sContent);
}void Lib_bit7z::callbackTotal(uint64_t size)
{m_nTotalSize = size;qDebug()<<QString("total -- %1").arg(size);
}wstring Lib_bit7z::stringToWstring_WindowApi(const string &str)
{int nLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), nullptr, 0);wchar_t* buffer = new wchar_t[nLen + 1];MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, nLen);buffer[nLen] = '\0'; //字符串断尾wstring wstr = buffer; //赋值delete[] buffer; //删除缓冲区return wstr;// return L"";
}string Lib_bit7z::wstringToString_WindowsApi(const wstring &wstr)
{int nLen = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), nullptr, 0, nullptr, nullptr);char* buffer = new char[nLen + 1];WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, nLen, nullptr, nullptr);buffer[nLen] = '\0'; //字符串断尾string str = buffer; //赋值delete[] buffer; //删除缓冲区return str;// return "";
}//----------------------------------------------------------------------------
// 解压
void Lib_bit7z::extract(const QString &sZip, const QString &sDir)
{m_nTotalSize = 0;wstring wZip = stringToWstring_WindowApi(sZip.toLocal8Bit().toStdString());wstring wDir = stringToWstring_WindowApi(sDir.toLocal8Bit().toStdString());try{qDebug()<<QString::fromStdWString(lib_path);qDebug()<<QFileInfo::exists(QString::fromStdWString(lib_path));qDebug()<<"[wZip] : "<<QString::fromStdWString(wZip);qDebug()<<"[wDir] : "<<QString::fromStdWString(wDir);Bit7zLibrary lib(lib_path);BitExtractor extractor(lib, BitFormat::Auto);ProgressCallback pc = std::bind(&Lib_bit7z::callbackProcess, this, std::placeholders::_1);TotalCallback tc = std::bind(&Lib_bit7z::callbackTotal, this, std::placeholders::_1);FileCallback fc = std::bind(&Lib_bit7z::callbackFile, this, std::placeholders::_1);if(passWord.trimmed()!=""){wstring wPassWord=stringToWstring_WindowApi(passWord.toLocal8Bit().toStdString());extractor.setPassword(wPassWord);}extractor.setProgressCallback(pc);extractor.setTotalCallback(tc);extractor.setFileCallback(fc);extractor.extract(wZip, wDir);}catch (const BitException& ex){qDebug()<<"extract ---> "<<ex.what();emit MessAgeError(QString::fromStdString(ex.what()));return;}
}void Lib_bit7z::compress(const QString &sDir, const QString &sZip)
{m_nTotalSize = 0;wstring wDir = stringToWstring_WindowApi(sDir.toLocal8Bit().toStdString());wstring wZip = stringToWstring_WindowApi(sZip.toLocal8Bit().toStdString());try{Bit7zLibrary lib(lib_path);BitCompressor compressor(lib, BitFormat::SevenZip);ProgressCallback pc = std::bind(&Lib_bit7z::callbackProcess, this, std::placeholders::_1);TotalCallback tc = std::bind(&Lib_bit7z::callbackTotal, this, std::placeholders::_1);FileCallback fc = std::bind(&Lib_bit7z::callbackFile, this, std::placeholders::_1);if(passWord.trimmed()!=""){wstring wPassWord=stringToWstring_WindowApi(passWord.toLocal8Bit().toStdString());compressor.setPassword(wPassWord);}compressor.setProgressCallback(pc);compressor.setTotalCallback(tc);compressor.setFileCallback(fc);QFile::remove(sZip);compressor.compressDirectory(wDir, wZip); //compressing a directory}catch (const BitException& ex){qDebug()<<"extract ---> "<<ex.what();emit MessAgeError(QString::fromStdString(ex.what()));}
}
内容扩展
预览内容时获取文件修改时间
宏定义
//FILETIME 时间有效性判断
#define ISTIME(time) ((time.dwLowDateTime==0&& time.dwHighDateTime==0)?FALSE:TRUE)
#define FILETIME_ISVALID(lastcreate,lastwrite,lastaccess) (ISTIME(lastaccess)?lastaccess:(ISTIME(lastwrite)?lastwrite:lastcreate))
调用:
//items[i] 为BitArchiveItem类型FILETIME TIME=FILETIME_ISVALID((items[i].getProperty(BitProperty::CTime).isFiletime()?items[i].getProperty(BitProperty::CTime).getFiletime():FILETIME()),(items[i].getProperty(BitProperty::ATime).isFiletime()?items[i].getProperty(BitProperty::ATime).getFiletime():FILETIME()),(items[i].getProperty(BitProperty::MTime).isFiletime()?items[i].getProperty(BitProperty::MTime).getFiletime():FILETIME()));
预览内容时获取文件大小
宏定义
#define KB (1024.0)
#define MB (1048576.0)
#define GB (1073741824.0)
#define TB (1099511627776.0)
调用:
///获取文件大小static QString Getsize(LONGLONG _size){if(_size>TB)return QString("%1 TB").arg(QString::number(_size/TB,'f',2));if(_size>GB)return QString("%1 GB").arg(QString::number(_size/GB,'f',2));if(_size>MB)return QString("%1 MB").arg(QString::number(_size/MB,'f',2));if(_size>KB)return QString("%1 KB").arg(QString::number(_size/KB,'f',2));elsereturn QString("%1 B").arg(QString::number(_size,'f',2));}
相关文章:
Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(二)
修改qt5 7zip源码编译及使用(含展示进度)一文中的封装类ZlibHelper代码类,继承多线程,使解压,压缩时进度条不影响界面,同时添加压缩文件中的文件预览功能,建议直接看源码 导读 相关代码内容扩展预览内容时获取文件修改…...

224、仿真-基于51单片机音乐播放器流水灯控制Proteus仿真设计(程序+Proteus仿真+原理图+程序流程图+元器件清单+配套资料等)
毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…...

虹科展会 | 自动驾驶展品:上海汽车测试展精彩回顾
2023年8月9日-8月11日,上海国际汽车测试及质量监控博览会在上海圆满落幕。本次展会提供了一个了解最新汽车测试及质量监控技术、产品和趋势的机会,同时也是汽车测试及质量监控领域的专业人士和业内人士的重要交流平台。 雅名特是虹科旗下子公司ÿ…...

Unity自定义脚本的 初始模版
参考博主:Unity修改创建的脚本模板,Unity脚本模板路径_unity hub 怎么改脚本模板_先生沉默先的博客-CSDN博客 【100个 Unity实用技能】 ☀️ | Unity自定义脚本的初始模版_unity 模板脚本_呆呆敲代码的小Y的博客-CSDN博客 一,将脚本放到Ed…...

vue3中使用第三方插件mitt实现任意组件通讯
vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一,现在我在写代码时,一个组件的代码超过了200行,基本都会拆分组件。组件拆分后,组件之间的通讯就很重要,总结了一下,目前有这…...

(五)、深度学习框架源码编译
1、源码构建与预构建: 源码构建: 源码构建是通过获取软件的源代码,然后在本地编译生成可执行程序或库文件的过程。这种方法允许根据特定需求进行配置和优化,但可能需要较长的时间和较大的资源来编译源代码。 预构建: 预…...

迈向通用听觉人工智能!清华电子系、火山语音携手推出认知导向的听觉大语言模型SALMONN
日前,清华大学电子工程系与火山语音团队携手合作,推出认知导向的开源听觉大语言模型SALMONN (Speech Audio Language Music Open Neural Network)。 大语言模型 SALMONN LOGO 相较于仅仅支持语音输入或非语音音频输入的其他大模型,SALMONN对…...
NOIP 2015 扫雷(mine)
扫雷(mine) 说明 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会…...
elaticsearch(3)
整合springboot 1.整合依赖 注意依赖版本和安装的版本一致 <properties> <java.version>1.8</java.version> <!-- 统一版本 --> <elasticsearch.version>7.6.1</elasticsearch.version> </properties> 导入elastics…...

DevOps系列文章 之 Gitlab+Docker自动部署SpringBoot
1.环境要求 以下服务器的操作系统均为Centos7 服务器A:Gitlab服务器B:GitlabRunner、Docker、docker-compose、Java1.8、maven3.6.3、git ps:这里可以把服务器B的GitlabRunner、Java1.8、maven3.6.3、git单独提出来,独立部署&a…...

React Native 列表组件基础知识
ScrollView 组件 ScrollView组件是一个容器滚动组件,当容器超出指定宽高时就可以进行滚动交互。 ScrollView组件是一次性渲染所有的 React 子组件,这在性能上是比较差的,所以不建议当列表特别长的时候使用此组件。 接下来列举几个常用的一…...

操作系统的体系结构、内核、虚拟机
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 操作系统结构 一、操作系统体系结构1.1操作系统的内核1.1.…...
【C++】vector的基本用法
vector是动态数组的同义词 一、vector对象带参数构造 1.vector<int>a(a,a5);//左闭右开 2.vector<int>b(n,z);n个z 3.vector<int>c(a);//拷贝 二、动态数组可以整体赋值 vector<int>vec; vector&l…...

SSM——用户、角色、权限操作
1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…...

UI界面设置
文章目录 1. 修改 share.html 内容如下:2. 修改 html 文件格式为 utf-83.保存,运行程序4. 访问页面 1. 修改 share.html 内容如下: <!DOCTYPE html><html> <head><meta charset"utf-8"><title>1v1屏…...

论文学习——PixelSNAIL:An Improved Autoregressive Geenrative Model
文章目录 引言论文翻译Abstract问题 Introduction第一部分问题 第二部分问题 Model Architecture网络结构第一部分问题第二部分问题 Experiments实验问题 Conclusion结论问题 总结参考 引言 这篇文章,是《PixelSNAIL:An Improved Autoregressive Geenrative Model》…...

mySQL 视图 VIEW
简化版的创建视图 create view 视图名 as select col ...coln from 表create view 视图名(依次别名) as select col ...coln from 表create view 视图名 as select col “别名1”,。。。col "别名n" from 表show tab…...

「UG/NX」Block UI 曲线收集器CurveCollector
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...

微信小程序:函数节流与函数防抖
目录 问题引入: 定义 解决方案:函数节流 一、案例举例 1.页面展示 2.search.wxml标签展示 3.search.js展示 4.结果展示 二、函数节流解决问题 1.函数 2.实例应用 三、函数防抖解决问题 1.函数 2.原理 3.应用场景 4.应用实例 总结 问题引入…...

Mathematica(42)-计算N个数值的和
比如,我们要用Mathematica求得到下面的式子: 这就需要用到一个函数:Sum 具体地,Sum函数的使用形式如下: 因此,按照公式就可以得到下面的结果: 如果,我们想要将求和号也加进去&#…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...