直接上代码
#if _MSC_VER >=1600 // VS2010版本号是1600
#pragma execution_character_set("utf-8")
#endif
#include "QtWidgetsApplication7.h"
#include <QtWidgets/QApplication>
#include <QFileInfoList>
#include <QDir>
#include "5.6.3/QtGui/private/qzipreader_p.h"
#include "5.6.3/QtGui/private/qzipwriter_p.h"
#include "qdebug.h"
//bool QZipReader::extractAll(const QString& destinationDir) const
//{
// QDir baseDir(destinationDir);
//
// if (!baseDir.exists()) {
// baseDir.mkpath(destinationDir);
// }
//
// const QVector<FileInfo> allFiles = fileInfoList();
//
// for (FileInfo fi : allFiles) {
// const QString absPath = QDir::toNativeSeparators(QString("%1/%2").arg(destinationDir, fi.filePath));
// baseDir.mkpath(QFileInfo(absPath).absoluteDir().path());
//
// if (fi.isFile) {
// QFile f(absPath);
//
// if (!f.isOpen()) {
// f.open(QIODevice::WriteOnly);
// }
//
// f.write(fileData(fi.filePath));
// f.setPermissions(fi.permissions);
// f.close();
// }
// }
//
// return true;
//}
bool deCompressZip(const QString& zipPath, const QString& zipDir)
{
QDir tempDir;
if (!tempDir.exists(zipDir)) tempDir.mkpath(zipDir);
QZipReader reader(zipPath);
QDir baseDir(zipDir);
if (!baseDir.exists()) {
baseDir.mkpath(zipDir);
}
const QVector<QZipReader::FileInfo> allFiles = reader.fileInfoList();
for (QZipReader::FileInfo fi : allFiles) {
const QString absPath = QDir::toNativeSeparators(QString("%1/%2").arg(zipDir, fi.filePath));
baseDir.mkpath(QFileInfo(absPath).absoluteDir().path());
if (fi.filePath == "设计规则/L型挡墙.rwx")
{
qDebug() << "1" ;
}
if (fi.isFile) {
QFile f(absPath);
if (!f.isOpen()) {
f.open(QIODevice::WriteOnly);
}
QByteArray dt = fi.filePath.toUtf8();
QString strtemp = QString::fromLocal8Bit(dt);
QByteArray tmp = reader.fileData(strtemp);
f.write(tmp);
f.setPermissions(fi.permissions);
f.close();
}
else
{
QDir dir(absPath);
if (!dir.exists())
{
dir.mkpath(absPath);
}
}
}
return true;
}
bool TraverseAndAdd(QZipWriter* pZWrite, const QString& curDir, const QString& relativeDir)
{
QDir dir(curDir);
QFileInfoList fInfoList = dir.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
for (const QFileInfo& eachFile : fInfoList)
{
QString pathInZip = eachFile.fileName();
QString absPath;
if (eachFile.isFile())
absPath = eachFile.absoluteFilePath();
if (false == relativeDir.isEmpty())
pathInZip = relativeDir + QDir::separator() + eachFile.fileName();
if (eachFile.isDir())
{
TraverseAndAdd(pZWrite, eachFile.absoluteFilePath(), pathInZip);
}
else
{
QFile fRead(absPath);
if (!fRead.open(QIODevice::ReadOnly))
continue;
pZWrite->addFile(pathInZip, fRead.readAll());
fRead.close();
}
}
return true;
}
bool CompressFolder(const QString& srcFolder, const QString& zipFilePath)
{
QZipWriter writer(zipFilePath);
bool ret = TraverseAndAdd(&writer, srcFolder, "");
writer.close();
return ret;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication7 w;
w.show();
QString strZipPath("C:\\Users\\zhangy-eu\\Documents\\GroadWork\\examples\\test.zip");
deCompressZip(strZipPath, QString::fromStdWString(L"C:\\Users\\zhangy-eu\\Documents\\GroadWork\\examples\\01-示例1222"));
//CompressFolder(QString::fromStdWString(L"C:\\Users\\zhangy-eu\\Documents\\GroadWork\\examples\\01-示例1\\"), strZipPath);
return a.exec();
}