From 3324b21eb041b41f352b7267706e6dcee366bc73 Mon Sep 17 00:00:00 2001 From: Liu Zheng Date: Thu, 19 Sep 2024 14:23:58 +0800 Subject: [PATCH] fix: Fix pigz special character problem Fix pigz special character problem Log: Fix pigz special character problem Bug: https://pms.uniontech.com/bug-view-274761.html --- 3rdparty/libpigzplugin/libpigzplugin.cpp | 35 +++++++++++++++++++----- 3rdparty/libpigzplugin/libpigzplugin.h | 3 +- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/3rdparty/libpigzplugin/libpigzplugin.cpp b/3rdparty/libpigzplugin/libpigzplugin.cpp index 67188bad..0ce2bb10 100644 --- a/3rdparty/libpigzplugin/libpigzplugin.cpp +++ b/3rdparty/libpigzplugin/libpigzplugin.cpp @@ -86,7 +86,10 @@ PluginFinishType LibPigzPlugin::addFiles(const QList &files, const Co m_isProcessKilled = false; // 压缩命令tar -cvf - filename | pigz -p 2 -5> filename.tar.gz - m_process = new QProcess; + m_process = new KPtyProcess; + m_process->setPtyChannels(KPtyProcess::StdinChannel); + m_process->setOutputChannelMode(KProcess::MergedChannels); + m_process->setNextOpenMode(QIODevice::ReadWrite | QIODevice::Unbuffered | QIODevice::Text); //m_process->setProcessChannelMode(QProcess::MergedChannels); QString strFileName; @@ -116,19 +119,34 @@ PluginFinishType LibPigzPlugin::addFiles(const QList &files, const Co strTmparchive.replace(strold[n], strnew[n]); } - QString command = QString("tar --use-compress-program=\"pigz -k -p%1 -%2\" -cvf %3 %4") - .arg(options.iCPUTheadNum) - .arg(options.iCompressionLevel) - .arg(strTmparchive) - .arg(strFileName); + QString strTemp = QString("tar cvfz - %1 | pigz -p %2 -%3 > %4").arg(strFileName).arg(options.iCPUTheadNum).arg(options.iCompressionLevel).arg(strTmparchive); + if (0 == options.iCompressionLevel) { + strTemp = QString("tar cvf - %1 | pigz -p %2 -%3 > %4").arg(strFileName).arg(options.iCPUTheadNum).arg(options.iCompressionLevel).arg(strTmparchive); + } + + m_scriptPath = QDir::tempPath() + "/tempScript_" + QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()) + ".sh"; + QFile scriptFile(m_scriptPath); + if (scriptFile.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&scriptFile); + out << "#!/bin/bash\n"; + out << strTemp << "\n"; + scriptFile.close(); + QProcess::execute("chmod", { "+x", m_scriptPath }); + } + m_process->setProgram(m_scriptPath, QStringList()); connect(m_process, &QProcess::readyReadStandardOutput, this, [=] { readStdout(); }); + connect(m_process, &QProcess::readyReadStandardError, this, [=] { + QByteArray errorOutput = m_process->readAllStandardError(); + qDebug() << "Error Output:" << QString::fromLocal8Bit(errorOutput); + }); + connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(processFinished(int, QProcess::ExitStatus))); - m_process->start(command, QIODevice::ReadWrite | QIODevice::Unbuffered | QIODevice::Text); + m_process->start(); if (m_process->waitForStarted()) { m_childProcessId.clear(); @@ -259,6 +277,9 @@ void LibPigzPlugin::deleteProcess() m_process->blockSignals(true); // delete m_process之前需要断开所有m_process信号,防止重复处理 delete m_process; m_process = nullptr; + if (!m_scriptPath.isEmpty()) { + QFile::remove(m_scriptPath); + } } } diff --git a/3rdparty/libpigzplugin/libpigzplugin.h b/3rdparty/libpigzplugin/libpigzplugin.h index 19eb5a78..fd79ef3a 100644 --- a/3rdparty/libpigzplugin/libpigzplugin.h +++ b/3rdparty/libpigzplugin/libpigzplugin.h @@ -89,13 +89,14 @@ private Q_SLOTS: void processFinished(int exitCode, QProcess::ExitStatus exitStatus); private: - QProcess *m_process = nullptr; // 工作进程 + KPtyProcess *m_process = nullptr; // 工作进程 bool m_isProcessKilled = false; // 进程已经结束 QByteArray m_stdOutData; // 存储命令行输出数据 qint64 m_processId; // 进程Id QVector m_childProcessId; // 压缩tar.gz文件的子进程Id qlonglong m_qTotalSize; // 源文件总大小 QTimer *m_timer = nullptr; + QString m_scriptPath; // 脚本路径 }; #endif // libPigzPlugin_H