windows下通过qt使用zlib将文件夹压缩成zip格式,并且能解析
时间: 2024-01-24 17:02:18 浏览: 173
可以使用Qt的QZipWriter和QZipReader类来实现文件夹压缩和解压缩。
以下是一个简单的示例代码,演示如何使用QZipWriter将文件夹压缩成zip格式,并使用QZipReader解压缩:
```cpp
#include <QDir>
#include <QFile>
#include <QByteArray>
#include <QZipWriter>
#include <QZipReader>
void compressFolder(const QString& folderPath, const QString& zipFilePath)
{
QDir folder(folderPath);
if (!folder.exists()) {
qWarning("Folder does not exist: %s", qPrintable(folderPath));
return;
}
QFile zipFile(zipFilePath);
if (!zipFile.open(QIODevice::WriteOnly)) {
qWarning("Could not create zip file: %s", qPrintable(zipFilePath));
return;
}
QZipWriter zipWriter(&zipFile);
QDir::setCurrent(folderPath); // 设置当前目录为要压缩的文件夹,以便获取相对路径
QStringList files = folder.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
for (const QString& file : files) {
QString filePath = folderPath + QDir::separator() + file;
QString relativePath = folder.relativeFilePath(filePath); // 获取相对路径
if (QFileInfo(filePath).isDir()) {
zipWriter.addDirectory(relativePath);
compressFolder(filePath, zipFilePath + QDir::separator() + file); // 递归压缩子文件夹
} else {
QFile inputFile(filePath);
if (inputFile.open(QIODevice::ReadOnly)) {
QByteArray fileData = inputFile.readAll();
zipWriter.addFile(relativePath, fileData);
}
}
}
}
void decompressFolder(const QString& zipFilePath, const QString& folderPath)
{
QFile zipFile(zipFilePath);
if (!zipFile.open(QIODevice::ReadOnly)) {
qWarning("Could not open zip file: %s", qPrintable(zipFilePath));
return;
}
QZipReader zipReader(&zipFile);
if (!zipReader.exists()) {
qWarning("Invalid zip file: %s", qPrintable(zipFilePath));
return;
}
QDir folder(folderPath);
if (!folder.exists()) {
folder.mkpath(".");
}
QDir::setCurrent(folderPath); // 设置当前目录为要解压缩到的文件夹,以便创建相对路径
QList<QZipReader::FileInfo> files = zipReader.fileInfoList();
for (const QZipReader::FileInfo& fileInfo : files) {
QString filePath = folderPath + QDir::separator() + fileInfo.filePath;
if (fileInfo.isDir()) {
folder.mkpath(filePath);
} else {
QFile outputFile(filePath);
if (outputFile.open(QIODevice::WriteOnly)) {
QByteArray fileData = zipReader.fileData(fileInfo.filePath);
outputFile.write(fileData);
}
}
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString folderPath = "C:/Users/User/Desktop/test";
QString zipFilePath = "C:/Users/User/Desktop/test.zip";
compressFolder(folderPath, zipFilePath);
decompressFolder(zipFilePath, folderPath + "_unzip");
return app.exec();
}
```
以上代码将文件夹"C:/Users/User/Desktop/test"压缩成"test.zip"文件,并将其解压缩到"C:/Users/User/Desktop/test_unzip"文件夹中。注意,在Windows下,文件路径分隔符应使用反斜杠"\"而不是正斜杠"/"。
阅读全文