qt使用zlib将一个文件夹压缩成.zip,然后在将该.zip解压
时间: 2024-02-03 15:15:54 浏览: 135
QT下对资源的压缩解压缩,修改过,无需编译成库
你可以使用Qt自带的zlib库,来进行文件夹压缩和解压。
以下是一个简单的代码示例:
```cpp
#include <QDir>
#include <QFileInfo>
#include <QByteArray>
#include <QDebug>
#include <zlib.h>
// 压缩文件夹
void compressFolder(const QString& folderPath, const QString& zipFilePath)
{
// 打开zip文件
gzFile zipFile = gzopen(qPrintable(zipFilePath), "wb");
if (!zipFile) {
qWarning() << "Failed to open the zip file for writing.";
return;
}
// 遍历文件夹
QDir dir(folderPath);
QStringList files = dir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
foreach (QString file, files) {
QString filePath = folderPath + "/" + file;
QFileInfo fileInfo(filePath);
// 如果是文件夹,递归压缩
if (fileInfo.isDir()) {
QString subFolderPath = filePath;
QString subZipFilePath = zipFilePath + "/" + file + ".zip";
compressFolder(subFolderPath, subZipFilePath);
continue;
}
// 如果是文件,读取文件内容
QFile f(filePath);
if (!f.open(QIODevice::ReadOnly)) {
qWarning() << "Failed to open file:" << filePath;
continue;
}
QByteArray data = f.readAll();
f.close();
// 将文件名和内容写入zip文件
QByteArray fileNameBytes = file.toUtf8();
QByteArray contentBytes = qCompress(data);
gzwrite(zipFile, fileNameBytes.constData(), fileNameBytes.length());
gzwrite(zipFile, contentBytes.constData(), contentBytes.length());
}
// 关闭zip文件
gzclose(zipFile);
}
// 解压zip文件
bool decompressZip(const QString& zipFilePath)
{
// 打开zip文件
gzFile zipFile = gzopen(qPrintable(zipFilePath), "rb");
if (!zipFile) {
qWarning() << "Failed to open the zip file for reading.";
return false;
}
// 创建目标文件夹
QString targetFolder = zipFilePath + "_unzip";
if (!QDir().mkpath(targetFolder)) {
qWarning() << "Failed to create target folder:" << targetFolder;
return false;
}
// 读取zip文件内容
char buffer[4096];
int bytesRead = 0;
while ((bytesRead = gzread(zipFile, buffer, sizeof(buffer))) > 0) {
QByteArray data(buffer, bytesRead);
// 解析文件名和内容
int separatorIndex = data.indexOf('\0');
if (separatorIndex < 0) {
qWarning() << "Invalid zip file format.";
gzclose(zipFile);
return false;
}
QByteArray fileNameBytes = data.left(separatorIndex);
QByteArray contentBytes = data.mid(separatorIndex + 1);
// 写入文件
QString filePath = targetFolder + "/" + QString::fromUtf8(fileNameBytes);
QFile f(filePath);
if (!f.open(QIODevice::WriteOnly)) {
qWarning() << "Failed to create file:" << filePath;
gzclose(zipFile);
return false;
}
QByteArray uncompressedData = qUncompress(contentBytes);
f.write(uncompressedData);
f.close();
}
// 关闭zip文件
gzclose(zipFile);
return true;
}
int main(int argc, char *argv[])
{
// 压缩文件夹
QString folderPath = "/path/to/folder";
QString zipFilePath = "/path/to/folder.zip";
compressFolder(folderPath, zipFilePath);
// 解压zip文件
QString unzipFilePath = "/path/to/folder.zip_unzip";
decompressZip(zipFilePath);
return 0;
}
```
在上述代码中,`compressFolder` 函数用于压缩文件夹,`decompressZip` 函数用于解压zip文件。你可以根据自己的需要修改文件路径等参数。
阅读全文