Qt 使用 QZipReader 解压文件
![头图](https://img-blog.csdnimg.cn/9ac8ac28c6a34a0d89b75e0fbfdb3dfa.png#pic_center)
Qt 使用 QZipReader 解压文件
文章目录
- Qt 使用 QZipReader 解压文件
- 摘要
- 关于 QZipReader
- 使用 QZipReader
- 代码解释:
- 快速解 extractAll
关键字:
Qt
、
QZipReader
、
extractAll
、
Zip
、
解压缩
摘要
每日一坑,坑坑难过,今日在拉取上级给我的压缩包是发现总是解压有问题,总是无法完全解压,最后发现是上级的压缩文件中多了文件夹递归的情况,所以在本地进行模拟,发现可以解压,但是上级给我的就是加压不了,可以用标准的压缩工具可以解压缩,最后发现是上级在压缩的时候没有对应的目录信息,标准压缩工具是带有目录的信息,所以保险起见,我对每个文件做了取路径处理。
关于 QZipReader
QZipReader
并不是 Qt 官方提供的类,而是一个常见的第三方库或自定义实用类,用于读取和解压缩 ZIP 文件。
使用 QZipReader
以下是一个假设的 QZipReader
使用示例,包括如何解压包含文件夹的 ZIP 包:
假设 QZipReader
是一个自定义类(或第三方库)用于读取 ZIP 文件,以下代码示例展示如何使用 QZipReader
类解压包含文件夹的 ZIP 包:
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QDebug>// 头文件可能在不同的路径,确保包含正确的头文件
#include "QZipReader.h" bool extractAllFiles(const QString &zipFilePath, const QString &destPath) {QZipReader zipReader(zipFilePath);if (!zipReader.exists()) {qWarning() << "Zip file does not exist:" << zipFilePath;return false;}QDir dir(destPath);if (!dir.exists()) {if (!dir.mkpath(destPath)) {qWarning() << "Could not create directory:" << destPath;return false;}}foreach (const QZipReader::FileInfo &fileInfo, zipReader.fileInfoList()) {QString filePath = destPath + "/" + fileInfo.filePath;QFileInfo fileInfoObj(filePath);if (fileInfo.isDir) {if (!dir.mkpath(filePath)) {qWarning() << "Could not create directory:" << filePath;return false;}} else {QFile file(filePath);if (!file.open(QIODevice::WriteOnly)) {qWarning() << "Could not open file for writing:" << filePath;return false;}QByteArray data = zipReader.fileData(fileInfo.filePath);file.write(data);file.close();}}zipReader.close();return true;
}int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);QString zipFilePath = "path/to/your/zipfile.zip";QString destPath = "path/to/extract/directory";if (extractAllFiles(zipFilePath, destPath)) {qDebug() << "Extraction successful!";} else {qDebug() << "Extraction failed!";}return app.exec();
}
代码解释:
-
初始化
QZipReader
:QZipReader zipReader(zipFilePath)
:创建一个QZipReader
实例,并指定要解压的 ZIP 文件路径。zipReader.exists()
:检查 ZIP 文件是否存在。
-
创建目标目录:
QDir dir(destPath)
:创建一个QDir
实例,用于表示解压的目标路径。dir.mkpath(destPath)
:如果目标路径不存在,则创建它。
-
遍历 ZIP 文件中的每个文件:
zipReader.fileInfoList()
:获取 ZIP 文件中所有文件信息的列表。foreach (const QZipReader::FileInfo &fileInfo, zipReader.fileInfoList())
:遍历每个文件信息。fileInfo.filePath
:获取文件路径。fileInfo.isDir
:判断文件是否是目录。
-
处理文件和目录:
QFileInfo fileInfoObj(filePath)
:创建QFileInfo
对象以获取文件信息。- 如果是目录,则使用
dir.mkpath(filePath)
创建目录。 - 如果是文件,则创建
QFile
对象并打开,以写模式写入数据。 zipReader.fileData(fileInfo.filePath)
:读取 ZIP 文件中对应文件的数据,并写入解压路径中的文件。
-
关闭 ZIP 文件:
zipReader.close()
:关闭 ZIP 文件。
确保你包含了 QZipReader
的正确头文件,并且你的项目中已正确链接了相应的库。如果 QZipReader
是你自己的类,请根据你的实现来调整代码。
快速解 extractAll
如果可以确定文件是标准压缩文件,就可以使用快速解extractAll。
![博客签名2021](https://img-blog.csdnimg.cn/cba67a62214f47c4be66d1024543cf80.png#pic_center)