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));}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探究arthas的命令

Arthas是一个Java诊断工具&#xff0c;用于在线诊断Java应用程序&#xff0c;以便更轻松地监控和分析应用程序的性能和行为。Arthas中有许多用于诊断Java应用程序的命令。 1. jvm 和 dashboard 命令的区别&#xff1a; jvm&#xff1a;该命令用于显示当前的JVM信息&#xff0c…

pointnet C++推理部署--tensorrt框架

classification 如上图所示&#xff0c;由于直接export出的onnx文件有两个输出节点&#xff0c;不方便处理&#xff0c;所以编写脚本删除不需要的输出节点193&#xff1a; import onnxonnx_model onnx.load("cls.onnx") graph onnx_model.graphinputs graph.inpu…

【C++】C++入门基础:引用详解

本篇继续分享关于C入门的相关知识&#xff0c;有关命名空间、缺省参数和函数重载的部分欢迎阅读我的上一篇文章【C】C入门基础详解&#xff08;1&#xff09;_王笃笃的博客-CSDN博客 继续我们的学习 引用 在C语言中我们接触过指针&#xff0c;很多人都或多或少为他感到头痛过…

使用SSH隧道将Ubuntu云服务器Jupyter Notebook端口映射到本地

本文主要实现了在Ubuntu云服务器后台运行Jupyter Notebook&#xff0c;并使用SSH隧道将服务器端口映射到本地 1. 生成配置文件 运行以下命令生成Jupyter Notebook的配置文件&#xff1a; jupyter notebook --generate-config这将在用户主目录下生成一个名为.jupyter的文件夹&…

MySQL索引ES索引

MySQL MySQL索引的种类 按照索引列值的唯一性:索引可分为唯一索引和非唯一索引; 唯一索引:此索引的每一个索引值只对应唯一的数据记录,对于单列唯一性索引,这保证单列不包含重复的值。对于多列唯一性索引,保证多个值的组合不重复。主键索引是唯一索引的特定类型。该索引…

【傅里叶级数与傅里叶变换】数学推导——3、[Part4:傅里叶级数的复数形式] + [Part5:从傅里叶级数推导傅里叶变换] + 总结

文章内容来自DR_CAN关于傅里叶变换的视频&#xff0c;本篇文章提供了一些基础知识点&#xff0c;比如三角函数常用的导数、三角函数换算公式等。 文章全部链接&#xff1a; 基础知识点 Part1&#xff1a;三角函数系的正交性 Part2&#xff1a;T2π的周期函数的傅里叶级数展开 P…

【Rust日报】2023-08-18 RustShip:一个新的 Rust 播客

探索 Rust 编译器基准测试套件 在最近关于 Rust 编译器 CI&#xff08;持续集成&#xff09;和基准测试基础设施的文章中&#xff0c;作者承诺写一篇关于运行时基准测试的博客文章&#xff0c;这是 Rust 编译器基准测试套件的新补充。然而&#xff0c;在这样做之前&#xff0c;…

信息熵,信息增益,增益率的理解

西瓜数据集D如下: 编号色泽根蒂敲声纹理脐部触感好瓜1青绿蜷缩浊响清晰凹陷硬滑是2乌黑蜷缩沉闷清晰凹陷硬滑是3乌黑蜷缩浊响清晰凹陷硬滑是4青绿蜷缩沉闷清晰凹陷硬滑是5浅白蜷缩浊响清晰凹陷硬滑是6青绿稍蜷浊响清晰稍凹软粘是7乌黑稍蜷浊响稍糊稍凹软粘是8乌黑稍蜷浊响清晰…

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

aardio窗体缩放自动匹配批量生成plus实例

import win.ui; /*DSG{{*/ var winform win.form(text"窗体缩放批量生成plus";right759;bottom469;bgcolor15780518) winform.add( custom{cls"custom";text"自定义控件";left3;top6;right753;bottom460;ah1;aw1;bgcolor15780518;z1} ) /*}}*//…

UML基础模型

目录 1.抽象类2.接口3.继承4.实现接口5.关联关系6.聚合关系7.合成&#xff08;组合&#xff09;关系8.依赖关系 1.抽象类 矩形框代表一个类&#xff08;Class&#xff09;。 类图分为三层&#xff1a; 第一层显示类的名称&#xff0c;如果是抽象类&#xff0c;就用斜体显示&am…

操作系统的体系结构、内核、虚拟机

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 操作系统结构 一、操作系统体系结构1.1操作系统的内核1.1.…

TiDB 多集群告警监控-中章-融合多集群 Grafana

作者&#xff1a; longzhuquan 原文来源&#xff1a; https://tidb.net/blog/ac730b0f 背景 随着公司XC改造步伐的前进&#xff0c;越来越多的业务选择 TiDB&#xff0c;由于各个业务之间需要物理隔离&#xff0c;避免不了的 TiDB 集群数量越来越多。虽然每套 TiDB 集群均有…

Educational Codeforces Round 2

目录 A. Extract Numbers B. Queries about less or equal elements C. Make Palindrome E. Lomsat gelral A. Extract Numbers 题意&#xff1a;太多不想翻译 思路&#xff1a;字符串模拟&#xff0c;我们使用一个临时变量t去储存每个符号直接的字符串&#xff0c;同时需…

0.flink学习资料

论文&#xff1a; &#xff08;1&#xff09;google dataflow model 下载链接&#xff1a;p1792-Akidau.pdf (vldb.org) Akidau T, Bradshaw R, Chambers C, et al. The dataflow model: a practical approach to balancing correctness, latency, and cost in massive-scal…

Gateway网关路由以及predicates用法(项目中使用场景)

1.Gatewaynacos整合微服务 服务注册在nacos上&#xff0c;通过Gateway路由网关配置统一路由访问 这里主要通过yml方式说明&#xff1a; route: config: #type:database nacos yml data-type: yml group: DEFAULT_GROUP data-id: jeecg-gateway-router 配置路由&#xff1a;…

【c++】c++的一些技术操作

pthread_create 的第三个参数&#xff0c;为函数指针&#xff0c;指向处理线程函数的地址。该函数&#xff0c;要求为静态函数。如果处理线程函数为类成员函数时&#xff0c;需要将其设置为静态成员函数。C静态成员函数访问非静态成员 https://blog.csdn.net/yueguangmuyu/arti…

Linux网络编程_Ubuntu环境配置安装

文章目录&#xff1a; 一&#xff1a;基于vmware虚拟机安装Ubuntu系统&#xff08;虚拟机&#xff09; 1.vmware下载 2.Ubuntu系统下载 3.配置 3.1 无法连网&#xff1a;这里很容易出现问题 3.2 更换国内源 3.3 无法屏幕适配全屏 3.4 汉化 二&#xff1a;直接安装Ubun…

宁德时代与陕汽签署十年战略合作协议,助力商用车电动化进程

据报道&#xff0c;宁德时代新能源科技股份有限公司与陕西汽车控股集团有限公司已经签署了一项为期十年的战略合作协议。双方的合作旨在推动商用车电池技术的发展&#xff0c;并面向商用车全领域应用。 这次战略合作具有重要意义&#xff0c;为宁德时代和陕汽启动了全面合作的序…

2021年3月全国计算机等级考试真题(C语言二级)

2021年3月全国计算机等级考试真题&#xff08;C语言二级&#xff09; 第1题 算法空间复杂度的度量方法是&#xff08;&#xff09; A. 算法程序的长度 B. 算法所处理的数据量 C. 执行算法所需要的工作单元 D. 执行算法所需要的存储空间 正确答案&#xff1a;D 第2题 下列叙…