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函数的使用形式如下: 因此,按照公式就可以得到下面的结果: 如果,我们想要将求和号也加进去&#…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
