3

Ubuntu 12.04 Node v0.6.14 CoffeeScript 1.3.1

fs.watchFile coffee_eval, (e) ->
  console.log e
  result = spawn 'coffee', ['-bc', coffee_eval]
  msg = ''
  result.stderr.on 'data', (str) ->
    msg+= str
  result.stderr.on 'end', ->
    console.log 'msg: ', msg
  print "!! #{coffee_eval}\n"

gist 上的完整代码:https ://gist.github.com/2621576

每次我保存一个被观看的文件时,主函数都会被称为 twitce 而不是一次。
我的编辑器是 Sumlime Text 2。

输出的话可以看到:
在此处输入图像描述

4

9 回答 9

5

fs.watchFile 不稳定。从节点文档:

fs.watchFile(filename, [options], listener)#

稳定性:2 - 不稳定。如果可用,请改用 fs.watch。

您可以尝试fs.watch,但不幸的是它可能会遇到同样的问题。fs.watch在尝试创建类似的监视脚本时,我在 Windows 上遇到了同样的问题。

解决方法是记录修改发生的时间,如果在几毫秒内触发第二次更改,则忽略它。有点难看,但它奏效了。

于 2012-05-06T14:57:43.927 回答
5

问题仍然存在,这是我找到的方法。

var actionDone = {}    
fs.watch('.', function(x,filename) {
        var path = './'+filename;
        var stats = fs.statSync(path);
        let seconds = +stats.mtime;
        if(actionDone[filename] == seconds) return;
        actionDone[filename] = seconds
       //write your code here
});

我们在继续之前检查上次修改时间是否不同。

于 2018-03-25T20:18:10.787 回答
1

我建议尝试 node-inotify-plusplus ( https://github.com/coolaj86/node-inotify-plusplus ),它比 fs.watchFile 或 fs.watch 对我来说效果更好。

于 2012-05-06T15:02:58.673 回答
1

如果您使用下划线或 lodash,您可以考虑使用节流阀并丢弃后沿的调用。一个基本的例子是

var fs = require('fs');
var _ = require("lodash");

function FileWatcher (fileName)
{
    this.file = fileName;
    this.onChange = _.throttle(this.trigger, 100, {leading: false});
}
FileWatcher.prototype.observe = function ()
{
    fs.watch(this.file, this.onChange);
}
FileWatcher.prototype.trigger = function ()
{
    console.log("file changed :)");
}

var fileToWatch = __dirname + "/package.json";
new FileWatcher(fileToWatch).observe();
于 2013-10-03T20:06:11.567 回答
0

为了解决这个问题,我会跟踪之前的“文件修改”时间戳,如果值相同,则不运行我的正常回调代码。

var filename = "/path/to/file";
var previousMTime = new Date(0);
var watcher = fs.watch(filename, {
    persistent: false
}, function(){
    fs.stat(filename, function(err, stats){
        if(stats.mtime.valueOf() === previousMTime.valueOf()){
            console.log("File Update Callback Stopped (same revision time)");
            return;
        }
        previousMTime = stats.mtime;

        // do your interesting stuff down here
    });
});
于 2013-05-19T05:52:28.700 回答
0

每次收到更新时,我通过将“忽略”标志从 false 翻转为 true 来解决这个问题,从而忽略每个第二个事件。我还发现,有时,对文件的更改只会导致一次更新。我不确定是什么原因造成的,但它似乎发生在更新非常频繁并且这些更新是附加的(>>)时。我没有观察到任何单个更改触发两个以上事件的实例。

这个问题有更多关于这个问题的讨论。我还在那里为我的解决方案发布了一些示例代码。

于 2015-09-26T07:06:21.423 回答
0

另一个比fs.watchor更好的 npm 模块建议fs.watchFile

https://github.com/paulmillr/chokidar/

于 2015-10-30T09:07:34.020 回答
0

它与原始问题没有直接关系,但是您知道这句话是什么意思吗?(来自fs.watch 文档)。

另请注意,侦听器回调附加到 fs.FSWatcher 触发的“更改”事件,但它与 eventType 的“更改”值不同。

于 2018-05-27T04:45:39.623 回答
0

现在(至少)已经解决了这个问题fs.watch。我没有尝试fs.watchFile,因为 NodeJS 文档不推荐它。

  • change每次修改文件时发生一个事件
  • 更改文件名时的2 个rename事件,一个用于当前名称,一个用于新名称
  • 新创建的文件(从其他位置复制)或删除的文件的一个rename事件。

我的环境:macOS 10.12.6 和 NodeJS v11.10.1

于 2019-04-08T13:15:31.167 回答