我试图执行该功能" gzip -c file.bin> file.zip"在Linux中。这在命令行上工作正常,但我需要使用Qt 4.8.2从我的应用程序中调用它。如果我尝试:
QProcess *pProc = QProcess(this);
connect(pProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onFinished(int, QProcess::ExitStatus)));
pProc->start("gzip -c file.bin > file.zip");
然后onFinished()报告退出代码为1.我已尝试过:
pProc->start("gzip", QStringList << "-c" << "file.bin" << ">" << "file.zip");
或者使用startDetached()代替,但我找不到有效的组合。
答案 0 :(得分:2)
问题: pProc-&gt; start(&#34; gzip -c file.bin&gt; file.zip&#34;); 是QProcess解释字符串中的每个项目,在命令之后,作为要传递给命令的参数。因此,它会传递gzip无法理解的项目,例如&#39;&gt;&#39;。
您需要做的是单独处理重定向,或者更改命令的调用方式。你可以尝试这样的事情: -
pProc->start("bash -c \"gzip -c file.bin > file.zip\"");
Bash可以使用命令字符串作为输入,使用-c参数,因此我们将字符串包装在引号中并将其传递给bash解释器。
答案 1 :(得分:0)
我按照vahancho的建议使用QProcess::setStandardOutputFile(),它运行正常。代码是:
#include <QObject>
#include <QString>
class TestZip : public QObject
{
Q_OBJECT
public:
TestZip(const QString file, const QString zip);
private slots:
void onZipReadyReadStandardOutput();
void onZipReadyReadStandardError();
void onZipFinished(int exitCode, QProcess::ExitStatus exitStatus);
private:
QProcess *_pZip;
};
#include <QFileInfo>
TestZip::TestZip(const QString file, const QString zip)
{
QFileInfo fileInfoZip(zip);
_pZip = new QProcess(this);
QString cmd = QString("gzip -c %1").arg(file);
_pZip->setStandardOutputFile(fileInfoZip.filePath());
Connect(_pZip, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onZipFinished(int, QProcess::ExitStatus)));
Connect(_pZip, SIGNAL(readyReadStandardOutput()), this, SLOT(onZipReadyReadStandardOutput()));
Connect(_pZip, SIGNAL(readyReadStandardError()), this, SLOT(onZipReadyReadStandardError()));
_pZip->start(cmd);
if (!_pZip->waitForStarted())
{
qDebug() << "Zip failed to start: " << cmd;
_pZip->deleteLater();
_pZip = NULL;
}
}
void TestZip::onZipReadyReadStandardOutput()
{
qDebug() << __FUNCTION__ << _pZip->readAllStandardOutput();
}
void TestZip::onZipReadyReadStandardError()
{
qDebug() << __FUNCTION__ << _pZip->readAllStandardError();
}
void TestZip::onZipFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << __FUNCTION__ << "(" << exitCode << ", " << exitStatus << ")";
_pZip->deleteLater();
_pZip = NULL;
}