执行外部进程,WinRAR和7zip都可以
依赖外部的压缩工具
(1) 导入库文件
将7z.dll 和7z.exe放到工程目录下
(2) 压缩
void zipFolder(const QString& path)
{
QString sourcePath = path + "/compressFolder";
QDir sourceFolderDir(sourcePath);
if (!sourceFolderDir.exists()) return;
QString binPath = "C:/"; // 替换成7z.exe实际所在文件夹位置
QString destinationFolder = "D:/";
QString zipName = "zipFold_2023";
QString arguments{"a", destinationFolder + "/" + zipName, sourcePath};
QProcess process;
process.start(binPath + "/7z.exe", arguments);
process.waitForFinished();
}
(3) 解压缩
void unZipFolder(const QString& filePath)
{
if (!QFile::exists(filePath)) return;
QString binPath = "C:/"; // 替换成7z.exe实际所在文件夹位置
QString destinationPath = "D:/";
QStringList arguments{ "x", "-o" + destinationPath, filePath, "-r", "-aoa" };
QProcess process;
process.start(binPath + "/7z.exe", arguments);
process.waitForFinished();
}
(4) 检查库文件是否存在
在调用7z.exe之前,最好检查一下库文件是否存在
void checkDepends(const QString& binPath)
{
QStringList depends{"7z.exe", "7z.dll"};
for(const QString& file : depends){
QString strFile = binPath + "/" + file;
if (!QFile::exists(strFile)) {
qWarning() << "missing dependency library" << strFile;
return;
}
}
return;
}
Qt自带的api, 使用方便
将文件压缩为特殊格式,不能直接用WinRAR,7zip来解压,只能通过qUncompress解压读取
(1) 头文件
#include <QByteArray>
#include <QDebug>
#include <QFile>
#include <QIODevice>
(2) 压缩
void Widget::zip()
{
QFile file("E:/1.bmp");
file.open(QIODevice::ReadOnly);
qint64 length = file.size();
QByteArray buff;
buff = file.read(length);
file.close();
buff = qCompress(buff, 5);
QFile write("E:/1.data");
write.open(QIODevice::WriteOnly);
write.write(buff);
write.close();
(3) 解压缩
void Widget::unzip()
{
QFile read("E:/1.data");
read.open(QIODevice::ReadOnly);
QByteArray data;
data = read.readAll();
read.close();
data = qUncompress(data);
QFile temp("E:/1.bmp");
temp.open(QIODevice::WriteOnly);
temp.write(data);
temp.close();
Qt自己的库,生成zip格式
在 pro 文件中,添加“QT += gui-private”
(1) 修改pro文件
QT += gui-private
(2) 导入头文件
#include <private/qzipwriter_p.h>
#include <private/qzipreader_p.h>
(3) 压缩
void zipWriter(QString path)
{
QZipWriter *writer = new QZipWriter(path + "/test.zip");
//添加文件夹
// writer->addDirectory(path + "/ss");
//添加文件
QFile file(path + "/test.txt");
if (!file.exists())
{
return;
}
file.open(QIODevice::ReadOnly);
writer->addFile("test.txt", file.readAll());
file.close();
writer->close();
}
(4) 解压
void zipReader(QString path)
{
QZipReader reader(path + "/test.zip");
reader.extractAll(path);
QFile file(path);
file.open(QIODevice::WriteOnly);
file.write(reader.fileData(QString::fromLocal8Bit("%1").arg(path + "/Desktop")));
file.close();
reader.close();
}
适用于多种平台,且打包后的zip文件可以通过其它工具打开
QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库。
依赖Zlip,因此编译QuaZIP库需要依赖zlip库。
(1)接口说明
QuaZip中的JlCompress类用来压缩和解压缩文件
/**
压缩文件夹
参数一fileCompressed:压缩后的文件
参数二dir:待压缩的目录
参数三recursive:是否递归
**/
static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);
/**
解压缩文件夹
参数一fileCompressed:待解压缩的文件
参数二fileCompressed:解压缩存放的目录
**/
static QStringList extractDir(QString fileCompressed, QString dir = QString());
(2) 配置
编好的QuaZip放入工程目录下
在工程中将quazip.lib所在库目录、头文件所在的目录添加到工程中。
pro中添加:
LIBS += -L"D:/quazip/lib" -lquazip
INCLUDEPATH += D:/quazip/src
DEPENDPATH += D:/quazip/src
(3) 压缩/解压缩
#include <QApplication>
#include "JlCompress.h" // 导入QuaZip头文件
int main(int argc, char **argv)
{
QApplication app(argc,argv);
// 压缩文件夹
JlCompress::compressDir("F:\\QuaZip.zip", "F:\\QuaZip");
// 解压缩文件夹
JlCompress::extractDir("F:\\QuaZip.zip", "F:\\ExtractQuaZip");
return app.exec();
}
Qt下压缩解压文件夹(2)Qzipwriter Qzipreader_黄权浩的博客-CSDN博客
利用Qt的qCompress和qUncompress来压缩和解压文件_prompty的博客-CSDN博客
Qt之zip压缩/解压缩-QuaZIP-阿里云开发者社区