20

我制作了一个node.js应用程序,以递归方式列出目录中的所有.txt文件,并为每个文件做一些事情。

这是我的app.js

var spawn = require('child_process').spawn,
    dir = spawn('dir', ['*.txt', '/b']);

dir.stdout.on('data', function (data) {
    //do some stuff with each stdout line...
    console.log('stdout: ' + data);
});

dir.stderr.on('data', function (data) {
    //throw errors
    console.log('stderr: ' + data);
});

dir.on('close', function (code) {
    console.log('child process exited with code ' + code);
});

当我node app.js通过控制台运行时,我收到以下错误消息:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:980:11)
    at Process.ChildProcess._handle.onexit (child_process.js:771:34)

v0.10.13win32环境中使用节点。

我这样做(spawn)是因为我想stdout逐行处理(exec方法将整个释放stdout为一个字符串)。

* 更新 *

顺便说一句,使用spawnforchild_process并不能保证 for 的输出cmd dir将是一行一行的。我也为此创建了一个问题

4

2 回答 2

20

发生这种情况是因为dir它不是 Windows 中的可执行文件。这是来自 shell 的命令。
您的问题的解决方案如下:

var dir = spawn('cmd', ['/c', 'dir']);
dir.stdout.on("data", function() {
    // do things
})

这个确切的问题也在这里

于 2013-07-19T15:23:47.620 回答
15

几件事:

  • dir在windows中不是真正的可执行文件,所以node.js找不到你要运行的程序。
  • 您没有将'error'处理程序绑定到您的子进程,并且该事件变成了使您的节点实例崩溃的异常。做这个:
dir.on('error', function (err) {
  console.log('目录错误', err);
});
  • 请改用fs.readdir。这是一个标准的 node.js API,做同样的事情。
于 2013-07-19T15:26:15.550 回答