windows下通过qt使用zlib将一个文件夹压缩成.zip后并保留文件夹内部文件的后缀
时间: 2024-02-05 21:11:36 浏览: 93
zlib库的使用,可以压缩和解压文件夹.zip
5星 · 资源好评率100%
可以使用Qt提供的zlib库来完成文件夹压缩。具体步骤如下:
1. 首先需要在Qt项目中添加zlib头文件和库文件,方法如下:
在.pro文件中添加:
```
LIBS += -lz
```
在源代码中添加头文件:
```c++
#include "zlib.h"
```
2. 创建一个压缩函数,传入需要压缩的文件夹路径和压缩后的文件路径作为参数:
```c++
bool compressFolder(const QString& folderPath, const QString& zipFilePath) {
// 打开需要压缩的文件夹
QDir dir(folderPath);
if (!dir.exists()) {
qDebug() << "Folder does not exist.";
return false;
}
// 创建压缩文件
QFile zipFile(zipFilePath);
if (!zipFile.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to create zip file.";
return false;
}
// 初始化zlib
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
if (deflateInit(&strm, Z_DEFAULT_COMPRESSION) != Z_OK) {
qDebug() << "Failed to initialize zlib.";
return false;
}
// 遍历文件夹并将文件逐个压缩写入到压缩文件中
QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
foreach (QFileInfo fileInfo, fileList) {
if (fileInfo.isDir()) {
// 如果是子文件夹,递归调用自己进行压缩
QString subFolderPath = fileInfo.absoluteFilePath();
QString subZipFilePath = zipFilePath + "/" + fileInfo.fileName() + ".zip";
if (!compressFolder(subFolderPath, subZipFilePath)) {
return false;
}
} else {
// 如果是文件,则读入文件,压缩后写入到压缩文件中
QFile inputFile(fileInfo.absoluteFilePath());
if (!inputFile.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file:" << fileInfo.absoluteFilePath();
return false;
}
QByteArray inputData = inputFile.readAll();
inputFile.close();
QByteArray outputData;
outputData.resize(inputData.size() * 1.1 + 12);
strm.avail_in = inputData.size();
strm.next_in = (Bytef*)inputData.data();
strm.avail_out = outputData.size();
strm.next_out = (Bytef*)outputData.data();
int ret = Z_OK;
while (strm.avail_in != 0 && ret == Z_OK) {
ret = deflate(&strm, Z_NO_FLUSH);
if (ret != Z_OK) {
break;
}
if (strm.avail_out == 0) {
outputData.resize(outputData.size() * 2);
strm.avail_out = outputData.size() - strm.total_out;
strm.next_out = (Bytef*)(outputData.data() + strm.total_out);
}
}
while (ret == Z_OK) {
if (strm.avail_out == 0) {
outputData.resize(outputData.size() * 2);
strm.avail_out = outputData.size() - strm.total_out;
strm.next_out = (Bytef*)(outputData.data() + strm.total_out);
}
ret = deflate(&strm, Z_FINISH);
}
if (ret != Z_STREAM_END) {
qDebug() << "Failed to compress file:" << fileInfo.absoluteFilePath();
return false;
}
outputData.resize(strm.total_out);
zipFile.write(outputData);
}
}
// 结束压缩并关闭文件
deflateEnd(&strm);
zipFile.close();
return true;
}
```
这个函数会遍历传入的文件夹,如果遇到子文件夹则递归进行压缩,如果遇到文件则将文件读入内存,压缩后写入到压缩文件中。在压缩文件夹时,为了保留文件夹内部文件的后缀,我们可以将子文件夹压缩成以文件夹名为名字的.zip文件,而不是将全部文件压缩到一个.zip文件中。
注意,在压缩文件时,我们使用了zlib库提供的deflate函数进行压缩。这个函数可以将一个数据块压缩成另一个数据块,并返回压缩后的数据块。在这个函数中,我们需要提供输入数据和输出数据的缓冲区,以及两个缓冲区的大小。如果输出缓冲区不足以容纳压缩后的数据块,我们需要重新分配一个更大的输出缓冲区,并重新设置输出缓冲区的指针和大小。在压缩结束后,我们需要调用deflateEnd函数来释放zlib占用的资源。
3. 调用压缩函数进行压缩:
```c++
QString folderPath = "your/folder/path";
QString zipFilePath = "your/zip/file/path.zip";
if (compressFolder(folderPath, zipFilePath)) {
qDebug() << "Compress folder succeeded.";
} else {
qDebug() << "Compress folder failed.";
}
```
这段代码会将指定文件夹压缩成指定的.zip文件,并输出压缩结果。
阅读全文