目录
一、下载相关资源:
二、编译bit7z64.lib 静态库
三、使用静态库bit7z64.lib
四、成果展示
五、主要代码
借鉴https://blog.csdn.net/u011718663/article/details/119574759https://blog.csdn.net/u011718663/article/details/119574759
1.1 下载bit7z源码:https://github.com/rikyoz/bit7z
这个分支好用:https://gitcode.net/mirrors/rikyoz/Bit7z/-/tree/hotfix/v3.1.4
1.2 下载lzma源码:7-Zip - LZMA SDK(软件开发工具包)(英文版)
1.3 下载7z.dll: 7-Zip - 程序下载
(也可以通过百度搜索直接下载7z.dll)
私货:如果嫌麻烦,有已编译好的,可以运行的demo,下载地址:qt7zip压缩解压含进度-QT文档类资源-CSDN下载
解压下载的bit7z-master.zip和lzma1805.zip的压缩包,
如果bit7z最新分支不好用,用分支v3.14,工程环境比较完整
https://gitcode.net/mirrors/rikyoz/Bit7z/-/tree/hotfix/v3.1.4
2.1 将解压lzma1805.zip的如下文件:
2.2 放入解压bit7z-master.zip的如下位置:
2.3 在bit7z-master中找到pro文件,加载编译,就可以编译出bit7z64.lib
3.1 使用时编译会编译不通过,参考博客末尾处有解决方法:Qt5.12.9编译QuaZip并使用 及 直接调用7z_韭菜钟的博客-CSDN博客
3.2 原博客末尾关键处截图:
我改造了一下,将他们放在同一个目录中: LIBS += -L$$PWD/../lib -lbit7z64 -lOleAut32 -lUser32
4.1 lib目录中,将window10中的OleAut32.Lib和User32.Lib库拷贝到此lib目录中
4.2 bin64中,可以自己通过windeployqt命令补全环境,或者用开发工具打开源码编译运行
5.1 封装类ZlibHelper代码
#ifndef ZLIBHELPER_H
#define ZLIBHELPER_H
#ifndef NIMO_OBS_ZLIB_H
#define NIMO_OBS_ZLIB_H
#include
#include
#include
#include
#include
using namespace std;
class ZlibHelper : public QObject
{
Q_OBJECT
public:
ZlibHelper();
~ZlibHelper();
void extract(const QString& sZip, const QString& sDir); // 解压
void compress(const QString& sDir, const QString& sZip); // 压缩
private:
void callbackProcess(uint64_t size);
void callbackFile(wstring filename);
void callbackTotal(uint64_t size);
wstring stringToWstring_WindowApi(const string &str);
string wstringToString_WindowsApi(const wstring &wstr);
signals:
void sigProgress(uint64_t nValue, uint64_t nTotalSize);
void sigProgressFile(QString sFile);
private:
uint64_t m_nTotalSize; // 压缩前文件夹原始大小
};
#endif
#endif // ZLIBHELPER_H
#include "ZlibHelper.h"
#include "bit7z.hpp"
#include "bit7zlibrary.hpp"
#include
#include
using namespace bit7z;
//----------------------------------------------------------------------------
ZlibHelper::ZlibHelper()
: m_nTotalSize(0)
{
}
//----------------------------------------------------------------------------
ZlibHelper::~ZlibHelper()
{
}
//----------------------------------------------------------------------------
void ZlibHelper::callbackProcess(uint64_t size)
{
// double process = ((1.0 * size) / mSize);
qDebug()<
5.2 调用主界面代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked(); // 压缩
void on_pushButton_2_clicked(); // 解压
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "ZlibHelper.h"
#pragma execution_character_set("utf-8")
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ZlibHelper zlibHelper;
QString sDir = "H:/ttZip中文";
QString sZip = "H:/ttZip中文.7z";
zlibHelper.compress(sDir, sZip);
}
void MainWindow::on_pushButton_2_clicked()
{
ZlibHelper zlibHelper;
QString sZip = "H:/ttZip中文.7z";
QString sDir = "H:/ttZip中文测试";
zlibHelper.extract(sZip, sDir);
}