如何使用Qt检查路径中是否存在程序?

How to check if a program exists in path using Qt?

我有这个代码:

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;

我得到的输出是:

"" ""

但我想要 get 和错误提示:找不到命令。

提前致谢。

已编辑:

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

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

但我想将输出输出到 QString 中。

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

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

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

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

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

无论如何,我不确定这是否值得。你为什么不直接 运行 程序....我认为丢失的可执行文件和由于许多其他原因而失败的命令之间没有太大区别。

请试试这个:

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 将是 0 并且 stdOutputstdError 将是空的!这可能会产生误导。

问题是如果您的系统上存在该命令,您是否能够 运行 该命令。这意味着不要尝试启动它,看看会发生什么,差别很大!

这个怎么样?

我喜欢 which 的想法,但它在 Windows 下行不通,据我所知。

    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!