У меня есть exe-файл, который выполняет какое-то действие, а затем записывает результат в файл журнала. Я хочу активировать exe, после чего прочитайте файл журнала и проанализируйте его.child_process.exec синхронизация с внешним EXE-файлом
Моя проблема:
Скажем, validate()
- это функция, которая считывает файл журнала и анализирует его. Если я использую child_process.exec('myExe.exe',validate);
, он работает неправильно и генерирует исключение, потому что Node сначала пытается открыть файл журнала, но он еще не существует. Если я попытаюсь сделать это синхронизировано, как
child_process.exec('myExe.exe');
validate();
такой же проблема.
Любые идеи, как сначала запустить exe, затем [только после этого] проанализировать файл журнала?
EDIT: Это не кодовый вопрос. открывая exe вручную, а затем запустив модуль узла, удается вызвать validate() без сбоя. побочным эффектом этого является то, что узел теперь блокирует файл, и второй раз exe может открыть файл. вот код для обоих ехе (C++) и узел: Exe:
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using std::string;
using std::ofstream;
int main(int argc, char** argv) {
srand(time(NULL));
int random = rand() % 11;
string output = random >=5 ? "GOOD" : "BAD";
ofstream fileWriter("output.txt",std::ofstream::out);
if (fileWriter.is_open()){
fileWriter << output;
fileWriter.close();
}
return 0;
}
Узел:
var child = require('child_process');
var fs = require('fs')
var programPath = '<put your path here , I put my absolute path>'
var validate = function(){
var outputFile = fs.readFileSync(programPath+'\\output.txt').toString();
var compareFile = fs.readFileSync(programPath+'\\Compare.txt').toString();
if (outputFile == compareFile){
console.log('Success');
} else {
console.log('Failure');
}
}
var test = child.exec(programPath+'\\Scanner.exe',validate);
фактическая ошибка: возвращение binding.open (pathModule._makeLong (путь), stringToFlags (флаги), режим); ^ Ошибка: ENOENT, нет такого файла или каталога «... \ output.txt»
Hm, что [использование обратного вызова] (http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) должен работать. Можете ли вы показать нам функцию 'validate', которая открывает файл журнала? – Bergi
var validate = function() { \t var outputFile = fs.readFileSync (programPath + '\\ output.txt'). ToString(); \t var compareFile = fs.readFileSync (programPath + '\\ Compare.txt'). ToString(); \t if (outputFile == compareFile) { \t \t console.log ('Success'); \t} else { \t \t console.log ('Failure'); \t} } –
Дело в том, что если я открываю exe вручную, то начинаю узел, он работает, то есть это не проблема кода, а проблема синхронизации. –