【问题标题】:How to check if a program exists in path using Qt?如何使用Qt检查程序是否存在于路径中?
【发布时间】:2017-07-15 14:31:28
【问题描述】:

我有这个代码:

QProcess* proceso = new QProcess();
QString programa = "unknow -v";
proceso->start(programa);
proceso->waitForFinished();

QString normal = proceso->readAllStandardOutput();
QString errores = proceso->readAllStandardError();

qDebug() << normal;
qDebug() << errores;

我得到的输出是:

"" ""

但我想要获取并显示错误:找不到命令。

提前致谢。

已编辑:

我使用 Qt 找到了这个解决方案:

 int result = system("unknow -v");
 if(result!=0) {
   qDebug() << "No está instalado nasm";
 } else {
   qDebug() << "Está instalado.";
 }

但我想得到一个 QString 的输出。

【问题讨论】:

  • unknow -v 是什么,是用户输入的字符串吗?
  • @BasileStarynkevitch 谢谢你,unknow 是一个应该在路径中的程序。

标签: c++ qt command qprocess


【解决方案1】:

问题是您是否能够运行该命令,也就是该命令是否存在于您的系统上。这意味着不要尝试启动它并看看会发生什么,巨大的不同!

这个怎么样?

我喜欢 which 的想法,但它在 Windows 下无法运行,AFAIK。

    QProcess findProcess;
    QStringList arguments;
    arguments << myCommand;
    findProcess.start("which", arguments);
    findProcess.setReadChannel(QProcess::ProcessChannel::StandardOutput);

    if(!findProcess.waitForFinished())
        return false; // Not found or which does not work

    QString retStr(findProcess.readAll());

    retStr = retStr.trimmed();

    QFile file(retStr);
    QFileInfo check_file(file);
    if (check_file.exists() && check_file.isFile())
        return true; // Found!
    else
        return false; // Not found!

【讨论】:

    【解决方案2】:

    请试试这个:

    QProcess program;
    QString commandToStart= "unknown -v";
    QStringList environment = program.systemEnvironment();
    program.start(commandToStart);
    bool started = program.waitForStarted();
    if (!program.waitForFinished(10000)) // 10 Second timeout
        program.kill();
    
    int exitCode = program.exitCode();
    QString stdOutput = QString::fromLocal8Bit(program.readAllStandardOutput());
    QString stdError = QString::fromLocal8Bit(program.readAllStandardError());
    

    如果startedtrue,则程序可以启动。这通常意味着,它在路径中。如果是false,检查environment中的路径是否正确。

    exitCode 仅在进程可以实际启动并且出现其他问题的情况下才有帮助。如果程序根本无法启动,exitCode 将为0stdOutputstdError 将为空!这可能会产生误导。

    【讨论】:

      【解决方案3】:

      您可以使用getenv("PATH") 获取PATH 的值,然后将其拆分为冒号(或Windows 的分号),迭代那里的每个目录,测试它是否包含unknow 文件等。 ..

      所以你不需要任何 Qt 的东西。只是普通的 C++(string 操作)。

      (这不是万无一失的:其他一些进程可能会在这样的测试和进程的实际启动之间修改您的$PATH 中的目录;但在实践中通常应该足够了)

      在 POSIX 系统上,您可以通过 sh -c 运行命令(例如运行 sh -c 'unknow -v'),但要小心转义和 code injections(因此请检查字符串 unknow -v 是否有单引号和双引号等内容...)

      您也可以使用popen(3) 或者使用which,但我不建议这样做(太复杂)。

      无论如何,我不确定这是否值得。你为什么不简单地运行程序......我看不出缺少可执行文件和由于许多其他原因而失败的命令之间有什么区别。

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多