You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT C++无需外部库实现跨平台解压Zip、Tar.xz文件的方法

无第三方库实现跨平台解压方案

你已经完成文件下载环节,接下来可通过调用系统原生命令实现无依赖解压,无需引入Quazip等外部库。以下是针对Windows和Linux的具体实现:

核心思路

利用Qt的QProcess调用系统自带解压工具:

  • Windows:使用PowerShell内置的Expand-Archive命令(原生支持Zip格式)
  • Linux:使用系统预装的tar命令(原生支持Tar.xz格式)

修改后的完整代码

在现有下载代码的finished信号处理逻辑中,添加解压步骤:

QDialog dialog(this);
QFormLayout form(&dialog);
QProgressBar pb(this);
QLabel *label = new QLabel(this);
label->setText("更新进度");
form.addRow(label);
form.addWidget(&pb);
dialog.show();

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QUrl url("downloadUrl"); // 替换为实际下载链接
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);

// 根据系统自动设置下载文件名
QString downloadPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
QString filePath;
#ifdef Q_OS_WIN
filePath = downloadPath + "/fileToDownload.zip";
#elif defined(Q_OS_LINUX)
filePath = downloadPath + "/fileToDownload.tar.xz";
#endif
ui->textBrowser->setText(filePath);

QFile *file = new QFile(filePath);
if (!file->open(QIODevice::WriteOnly)) {
    qWarning() << "无法打开文件:" << file->errorString();
    return;
}

connect(reply, &QNetworkReply::readyRead, [=]() {
    file->write(reply->readAll());
});

connect(reply, &QNetworkReply::finished, [=]() {
    file->close();
    file->deleteLater();
    reply->deleteLater();
    dialog.deleteLater();

    // 下载完成后执行解压
    QString extractDir = downloadPath + "/extracted_files"; // 解压目标目录
    QDir().mkdir(extractDir); // 创建目标目录

    QProcess process;
#ifdef Q_OS_WIN
    // Windows下用PowerShell解压Zip
    process.start("powershell.exe", QStringList() << "-Command" << QString("Expand-Archive -Path '%1' -DestinationPath '%2' -Force").arg(filePath).arg(extractDir));
#elif defined(Q_OS_LINUX)
    // Linux下用tar解压Tar.xz
    process.start("tar", QStringList() << "-xJf" << filePath << "-C" << extractDir);
#endif

    // 等待解压完成并检查结果
    if (process.waitForFinished(-1)) {
        if (process.exitCode() == 0) {
            qInfo() << "解压成功,路径:" << extractDir;
        } else {
            qWarning() << "解压失败,错误信息:" << process.readAllStandardError();
        }
    } else {
        qWarning() << "解压进程启动失败:" << process.errorString();
    }
});

connect(reply, &QNetworkReply::downloadProgress, [&](qint64 bytesReceived, qint64 bytesTotal) {
    qInfo() << "已下载" << bytesReceived << "字节,总计" << bytesTotal << "字节。";
    processProgress(bytesReceived, bytesTotal, &pb);
});

QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();

关键说明

  • 跨平台适配:通过Qt的Q_OS_WIN、Q_OS_LINUX宏自动识别系统,切换解压逻辑
  • Windows兼容性:Expand-Archive是PowerShell 5.0及以上版本的命令,主流Windows系统均已预装;若需兼容老旧系统,可改用expand命令(仅支持Cab和部分Zip格式)
  • Linux兼容性:tar的-J参数对应xz压缩格式,绝大多数Linux发行版默认预装xz-utils依赖
  • 错误处理:添加了文件打开、进程启动、解压结果的多层错误检查,便于排查问题

内容的提问来源于stack exchange,提问作者Krishnendu Mukherjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:42:32