2015-02-20 3 views
0

У меня есть 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»

+0

Hm, что [использование обратного вызова] (http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) должен работать. Можете ли вы показать нам функцию 'validate', которая открывает файл журнала? – Bergi

+0

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} } –

+0

Дело в том, что если я открываю exe вручную, то начинаю узел, он работает, то есть это не проблема кода, а проблема синхронизации. –

ответ

1

В конце концов, проблема не пошел, как это: , когда узел открывает процесс, он открыт, как будто ехе были в папке узла , EXE записывает в каталог, в котором он находится, когда он включен, в папку узла. , узел узла, с другой стороны. имел абсолютный путь к исходному файлу EXE, и когда он пытается открыть файл журнала - его там нет, он находится в папке узла. решение состоит в передаче 'CWD' аргумент child_process.exec:

var test = child.exec(programPath+'\\Scanner.exe', { cwd: programPath }, validate); 
Смежные вопросы