child_process.exec与外部EXE文件同步

时间:2015-02-20 12:31:47

标签: javascript node.js asynchronous exe

我有一个执行某些操作的exe文件,然后将结果写入日志文件。 我想激活exe,然后在完成后阅读日志文件并进行分析。

我的问题是:
让我们说validate()是读取日志文件并对其进行分析的函数。如果我使用child_process.exec('myExe.exe',validate);它不能正常工作并抛出异常,因为Node首先尝试打开日志文件,但它还不存在。如果我尝试按照

进行同步
child_process.exec('myExe.exe');
validate();

同样的问题。

任何想法如何首先运行exe,然后[仅在它完成之后]分析日志文件?

编辑: 这不是代码问题。手动打开exe然后启动节点模块设法调用validate()而不会崩溃。这样做的副作用是节点现在正在锁定文件,而第二次运行的exe可以打开文件。这是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);

实际错误:   return binding.open(pathModule._makeLong(path),stringToFlags(flags),mode);                  ^ 错误:ENOENT,没有这样的文件或目录&#39; ... \ output.txt&#39;

1 个答案:

答案 0 :(得分:1)

最终问题是这样的: 当Node打开一个进程时,它就像exe在节点文件夹中一样打开。 EXE写入它所在的目录,即节点文件夹。 另一方面,节点模块。有原始EXE文件的绝对路径,当它尝试打开日志文件时 - 它不在那里,它在节点文件夹中。 解决方案是将'cwd'参数传递给child_process.exec:

var test = child.exec(programPath+'\\Scanner.exe', { cwd: programPath }, validate);