qt使用zlib将一个文件夹压缩成.zip后 里面文件的.后缀都没了
时间: 2024-02-05 19:11:13 浏览: 198
使用zlib库压缩目录
5星 · 资源好评率100%
在使用 zlib 库将一个文件夹压缩成 .zip 文件时,需要先将文件夹中的所有文件和目录一一遍历,并将它们添加到压缩文件中。这个过程中需要注意保留每个文件的后缀。
以下是一个示例代码,可以将一个文件夹压缩成 .zip 文件,并保留每个文件的后缀:
```cpp
#include <QtCore>
#include <zlib.h>
void addFileToZip(zipFile zf, const QString& filePath, const QString& fileName)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qWarning("Failed to open file %s", qPrintable(filePath));
return;
}
zip_fileinfo fileinfo;
memset(&fileinfo, 0, sizeof(fileinfo));
QFileInfo fileInfo(file);
QString fileNameInZip = fileName + "." + fileInfo.suffix();
QByteArray data = file.readAll();
zipOpenNewFileInZip(zf, qPrintable(fileNameInZip), &fileinfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
zipWriteInFileInZip(zf, data.data(), data.size());
zipCloseFileInZip(zf);
}
bool zipFolder(const QString& folderPath, const QString& zipFilePath)
{
QDir folder(folderPath);
if (!folder.exists()) {
qWarning("Folder %s does not exist", qPrintable(folderPath));
return false;
}
zipFile zf = zipOpen(qPrintable(zipFilePath), APPEND_STATUS_CREATE);
if (zf == NULL) {
qWarning("Failed to create zip file %s", qPrintable(zipFilePath));
return false;
}
QStringList files = folder.entryList(QDir::Files);
foreach (QString file, files) {
QString filePath = folder.absoluteFilePath(file);
addFileToZip(zf, filePath, file);
}
QStringList dirs = folder.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
foreach (QString dir, dirs) {
QString dirPath = folder.absoluteFilePath(dir);
QDir subFolder(dirPath);
QStringList subFiles = subFolder.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
foreach (QString subFile, subFiles) {
QString subFilePath = subFolder.absoluteFilePath(subFile);
QString fileName = dir + "/" + subFile;
addFileToZip(zf, subFilePath, fileName);
}
}
zipClose(zf, NULL);
return true;
}
```
在使用这个函数时,只需要调用 `zipFolder(folderPath, zipFilePath)` 函数,传入要压缩的文件夹路径和压缩后的 .zip 文件的路径即可。
阅读全文