在Linux中通过QProcess执行gzip

时间:2014-05-07 10:48:25

标签: linux qt qt4 gzip

我试图执行该功能" 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()代替,但我找不到有效的组合。

2 个答案:

答案 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;
}