2010-09-27 79 views
13

我想检测文件的更改,如果文件更改,我将使用child_process执行scp命令以将该文件复制到server.I查找node.js文档,fs.watchFile函数似乎做我想做的事情,但是当我尝试它时,不知何故,它不能像我所期望的那样工作。下面的代码被用于:通过watchFile检测node.js中的文件更改

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不等于”(我只访问文件)。输出:

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是一样的吗?

回答

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对象或字符串检查,但肯定似乎从你的描述这种方式)

+0

谢谢,我没有意识到,mtime属性是一个对象(我认为他们是字符串对象:(我使用typeof curr.mtime,它返回对象,有没有一种方法在JavaScript中找出什么样的对象在你给出的例子中,我认为obj1 == obj2,因为你只是改变了相等性检查,只有当他们做了识别检查obj1 ==== obj2。 – 2010-09-27 22:03:19

+1

你可以使用op erator'instanceof'就像这样:'var d = new Date(); if(d instanceof Date == true)alert(1);'或者取得文本对象类型使用'var d = new Date(); Object.prototype.toString。调用(d); //“[object Date]”' – Andris 2010-09-28 08:45:30

+0

我注意到的一件事是,如果我做了这样的事情:__var i = 10; if(i instanceof Number)alert(1); __ if语句从不为真(typeof i =>“number”and Object.prototype.toString.call(i)=>“[object Number]”,但是如果我声明i作为:var i =数字(10),它的工作原理。任何人都知道背后的原因? – 2010-09-29 05:11:11

0

快速和肮脏的解决方案。 如果您没有按照之前或之后的日期比较(<或>),并且您只是比较日期字符串,只需在每个日期字符串上快速执行toString()即可。

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

可悲的是正确的做法是

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

的+强制Date对象为int这是unixtime。

17

对于“聪明”的人:

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

你可能写了伪,但只是为了澄清,因为这些是日期对象,而不是整数值:+ curr.mtime - + prev.mtime – 2013-03-29 08:38:39

+10

@DirkSmaverson减法将日期对象强制为数字,就像一元加上运算符,所以它是等效的。 – CEL 2013-07-26 04:45:11

1

为了简化问题,您可以使用Watchr获得有用的事件(如果一个文件实际上已经改变只会触发change事件)。它也支持看整个目录树:)

1

我们使用的文件看,这甚至与Windows文件系统运行CentOS的机器的可疑情况下工作chokidar(Windows计算机上运行的流浪汉VirtualBox的CentOS的)

https://github.com/paulmillr/chokidar

+0

这对我来说很有用,监视Mac OSX上文件更新的时间。 – 2014-04-27 03:02:55