通过watchFile检测node.js中的文件更改

时间:2010-09-27 17:59:32

标签: javascript node.js

我想检测文件的变化,如果文件发生变化,我会用child_process执行scp命令将文件复制到server.I查找node.js文档,fs.watchFile函数似乎做了什么我想这样做,但是当我尝试它时,不知何故它只是按照我的预期不起作用。使用了以下代码:

var fs = require('fs');                                                                        

console.log("Watching .bash_profile");

fs.watchFile('/home/test/.bash_profile', function(curr,prev) {
    console.log("current mtime: " +curr.mtime);
    console.log("previous mtime: "+prev.mtime);
    if (curr.mtime == prev.mtime) {
        console.log("mtime equal");
    } else {
        console.log("mtime not equal");
    }   
});

使用上面的代码,如果我访问监视文件,回调函数得到执行,它将输出相同的mtime,并始终输出“mtime not equal”(我只访问该文件)。输出:

Watching .bash_profile
current mtime: Mon Sep 27 2010 18:41:27 GMT+0100 (BST)
previous mtime: Mon Sep 27 2010 18:41:27 GMT+0100 (BST)
mtime not equal

当两个mtime相同时,任何人都知道if语句失败的原因(也尝试使用===识别检查,但仍然得到相同的输出)?

6 个答案:

答案 0 :(得分:17)

如果mtime属性为Date个对象,则这些属性永远不会相等。在JavaScript中,如果它们实际上是同一个对象(变量指向同一个内存实例),则两个单独的对象是相等的。

obj1 = new Date(2010,09,27);
obj2 = new Date(2010,09,27);
obj3 = obj1; // Objects are passed BY REFERENCE!

obj1 != obj2; // true, different object instances
obj1 == obj3; // true, two variable pointers are set for the same object
obj2 != obj3; // true, different object instances

要检查这两个日期值是否相同,请使用

curr.mtime.getTime() == prev.mtime.getTime();

(我实际上不确定是否是这种情况,因为我没有检查watchFile是否输出Date对象或字符串,但从你的描述中看起来肯定是这样的)

答案 1 :(得分:17)

对于“聪明”的人:

if (curr.mtime - prev.mtime) {
    // file changed
}

答案 2 :(得分:9)

可悲的是,正确的方法是

if (+curr.mtime === +prev.mtime) {}

+强制Date对象为int,即unixtime。

答案 3 :(得分:1)

为了简化操作,您可以使用Watchr来获取有用的事件(如果文件实际已更改,则只会触发change事件)。它还支持观看整个目录树:)

答案 4 :(得分:1)

我们使用chokidar进行文件观看,即使在使用Windows文件系统运行的centos机器的可疑环境中工作(在Windows机器上运行的vagrant virtualbox centos)

https://github.com/paulmillr/chokidar

答案 5 :(得分:0)

快速而讨厌的解决方案。 如果您没有按照之前或之后(<或>)进行日期比较,而只是比较日期字符串,只需对每个日期字符串执行快速toString()。

 if (curr.mtime.toString() == prev.mtime.toString())