Qt在mac上的解压问题

6 篇文章 0 订阅

项目是用的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;

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值