2010-09-27 16 views
13

Quiero detectar cambios para un archivo, si el archivo cambia, usaré child_process para ejecutar un comando scp para copiar el archivo a un servidor. Busqué la documentación de node.js , la función fs.watchFile parece hacer lo que quiero hacer, pero cuando lo probé, de alguna manera simplemente no funciona como esperaba. Se utilizó el siguiente código:Detecta cambios de archivo en node.js a través de 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"); 
    } 
}); 

Con el código anterior, si puedo acceder al archivo visto, la función de devolución de llamada conseguir ejecutar, se dará salida a la misma -mtime, y siempre de salida "mtime no es igual" (sólo el acceso a la archivo). Salidas:

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 

Alguien sabe por qué la sentencia if no (también trató de usar === identificar cheque, pero aún así obtener la misma salida) cuando los dos -mtime son los mismos?

Respuesta

17

Si mtime propiedades son Date objetos, entonces estos nunca pueden ser iguales. En JavaScript dos objetos separados son iguales sólo si son en realidad el mismo objeto (las variables apuntan a la misma instancia de memoria)

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 

para comprobar si estos dos valores de fecha son los mismos, utilizan

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

(No estoy seguro de si este es el caso, ya que no comprueve si watchFile salidas de objetos o cadenas, pero definitivamente parece así desde su descripción)

+0

Gracias, no me di cuenta de que la propiedad mtime es un objeto (pensé que eran un objeto de cadena :(Utilicé typeof curr.mtime, return object, ¿Hay alguna forma de javascript para averiguar qué tipo de objeto? En el ejemplo dado, pensé en obj1 == obj2, porque solo cambias la verificación de igualdad, es solo falso cuando hacen la verificación de identificación obj1 ==== obj2. –

+1

Puedes usar la opción erator 'instanceof' como este:' var d = new Date(); if (d instanceof Date == true) alert (1); 'o alternativamente para obtener el tipo de objeto textual use' var d = new Date(); Object.prototype.toString.llamar (d); // "[object Date]" ' – Andris

+0

Una cosa que noto es que, si hago algo como: __var i = 10; if (i instanceof Number) alert (1); __ la instrucción if never true (typeof i => "number" y Object.prototype.toString.call (i) => "[object Number]", sin embargo si declaro i como: var i = Number (10), funciona. ¿Alguien sabe el motivo? –

0

solución rápida y desagradable. Si no está haciendo una comparación de fechas en términos de anterior o posterior (< o>) y simplemente está comparando las fechas, simplemente haga una rápida toString() en cada una.

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

Lamentablemente la forma correcta es

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

El + fuerza el objeto Date a int que es unixtime.

17

Para las personas "inteligentes":

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

probablemente esté escribiendo pseudo, pero solo para aclarar, ya que estos son objetos de fecha y valores no enteros: + curr.mtime - + prev.mtime –

+10

@DirkSmaverson resta coacciona los objetos de fecha en números, al igual que el unario plus operador, por lo que es equivalente. – CEL

1

Para simplificar las cosas que se pueden utilizar para obtener Watchr eventos útiles (sólo se disparará el evento change si un archivo ha cambiado en realidad). También es compatible con árboles viendo todo el directorio :)

1

Utilizamos chokidar para el archivo de observación, que funciona incluso en el contexto de una máquina de dudosa centos se ejecuta con un sistema de archivos de Windows (centos virtualbox vagabundo que se ejecuta en la máquina Windows)

https://github.com/paulmillr/chokidar

+0

Esto funciona para mí, monitoreando cuando los archivos se actualizan en Mac OSX. –

Cuestiones relacionadas