2017-02-24 66 views
1

我有這樣的代碼:如何檢查程序是否存在於使用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; 

我得到的輸出是:

「」 「」

但我希望得到和錯誤,說:命令未找到。

在此先感謝。

編輯:

我發現使用Qt這個解決方案:

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

但我希望得到一個輸出到QString的。

+0

什麼是'unknow -v',是從用戶輸入的一些字符串? –

+0

@BasileStarynkevitch謝謝你,'unknow'是一個應該在路上的程序。 –

回答

1

你可以獲取你的PATH使用getenv("PATH")的值,然後把它分解的冒號(或分號適用於Windows),遍歷每個目錄中有,測試它是否包含unknow文件,等等....

所以你不需要任何Qt的東西。只需簡單的C++(string操作)。

(這不是防彈:一些其他進程可能會修改目錄中的$PATH這樣的測試和過程的實際開始之間,但應該在實踐中往往是不夠的)

在POSIX系統上,可能直通sh -c運行命令(例如運行sh -c 'unknow -v'),但要小心脫離,而且code injections的(所以檢查字符串unknow -v的東西,如單引號和雙引號,等...)

您也可以使用popen(3)也許使用which,但我不建議(太複雜)。

無論如何,我不知道它是否值得這麼麻煩。你爲什麼不簡單地運行程序....我沒有看到很多其他原因失敗的可執行文件和命令失敗之間的區別。

+0

謝謝你,巴西爾,你是對的。 :) –

1

請試試這個:

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將爲空!這可能會引起誤解。

相關問題