项目是用的Qt写的,在windows上稳定运行长时间后,准备移植到mac上,发现windows上的quazip解压在mac上有问题:zip包解压后,替身全部变成原始文件。所以,放弃quazip库,使用Qt自己的QZipReader来解压(bool QZipReader::extractAll(const QString &destinationDir) ),但是又发现extractAll解压出来后全是文件夹(没有文件),这个是Qt自己的api本身就是如此。最终使用下面方法解决:
pro文件中添加,
QT += gui-private
#include "QtGui/private/qzipreader_p.h"
bool SQuaZip::decompressionZipFile(const QString &zipfile, const QString &path)
{
bool result = true;
if(zipfile.isEmpty() || path.isEmpty()){
return false;
}
QString zipDir = path;
QString zipPath = zipfile;
QZipReader zipReader(zipPath);
QDir baseDir(zipDir);
if (!baseDir.exists()) {
baseDir.mkpath(zipDir);
}
const QVector<QZipReader::FileInfo> allFiles = zipReader.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.isSymLink) {
QString destination = QFile::decodeName(zipReader.fileData(fi.filePath));
if (destination.isEmpty()){
result = false;
break;
}
QFileInfo linkFi(absPath);
if (!QFile::exists(linkFi.absolutePath()))
QDir::root().mkpath(linkFi.absolutePath());
if (!QFile::link(destination, absPath)){
result = false;
break;
}
}
else if (fi.isFile) {
QFile f(absPath);
if (!f.isOpen()) {
f.open(QIODevice::WriteOnly);
}
f.write(zipReader.fileData(fi.filePath));
f.setPermissions(fi.permissions);
f.close();
}
}
zipReader.close();
return result;
}