当监视文件被修改时,spawn ls ENOENT

时间:2017-07-07 11:31:05

标签: javascript node.js

我正在通过书籍Node.js the Right Way学习Node.js。我正在尝试运行以下示例来监视对名为target.txt的文件的更改,该文件与.js文件位于同一目录中。

"use strict";
const
    fs = require('fs'),
    spawn = require('child_process').spawn,
    filename = process.argv[2];
if (!filename) {
    throw Error("A file to watch must be specified!");
}
fs.watch(filename, function () {
    let ls = spawn('ls', ['-lh', filename]);
    ls.stdout.pipe(process.stdout);
});
console.log("Now watching " + filename + " for changes...");

更改文本文件并保存时出现以下错误:

  

events.js:160         扔掉//未处理的'错误'事件         ^

     

错误:产生ls ENOENT       at exports._errnoException(util.js:1018:11)       在Process.ChildProcess._handle.onexit(internal / child_process.js:193:32)       at onErrorNT(internal / child_process.js:367:16)       at _combinedTickCallback(internal / process / next_tick.js:80:11)       at process._tickCallback(internal / process / next_tick.js:104:9)

Node.js版本:v6.11.0

IDE :Visual Studio Code 1.13.1

操作系统:Windows 10 64x

1 个答案:

答案 0 :(得分:3)

Windows上没有ls,您应该使用dir

但是,这不是可执行文件。要运行.bat.cmd个文件,您可以:

  • Spawn cmd.exe并将这些文件作为参数传递:

    require('child_process').spawn('cmd', ['/c', 'dir']);
    
  • spawn选项设置为shell时使用true

    require('child_process').spawn('dir', [], { shell: true });
    
  • 使用exec代替spawn

    require('child_process').exec('dir', (err, stdout, stderr) => { ... });
    

有关详情,请查看this section in the official docs

修改

我不确定我是否在评论中正确理解了您的问题,但是如果您选择第二个选项,例如,您的代码将如下所示:

...

fs.watch(filename, function () {
    let dir = spawn('dir', [filename], { shell: true });

    dir.stdout.pipe(process.stdout);
});

...

请注意,您可能需要稍微调整此代码。我正在从内存中写这些内容,因为我现在无法访问Windows机器,因此我无法自行测试。