Pregunta

Quiero detectar cambios de un archivo, si los cambios en los archivos, voy a utilizar child_process para ejecutar un comando scp para copiar el archivo a un server.I parecía documentación hasta Node.js, la función fs.watchFile parece hacer lo Quiero hacerlo, pero cuando lo probé, de alguna manera simplemente no funciona como esperaba. El código siguiente se utilizaron:

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" (que sólo acceder al 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 intentado usar === identificar cheque, pero aún así obtener la misma salida) cuando los dos -mtime son los mismos?

¿Fue útil?

Solución

Si las propiedades mtime son objetos Date, entonces estos pueden no 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, el uso

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

(No estoy realmente seguro de si este es el caso, ya que no el registro si la fecha de objetos o cadenas watchFile salidas pero sin duda parece que esta manera de su descripción)

Otros consejos

Para las personas "inteligentes":

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

Lamentablemente la forma correcta es

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

Las fuerzas + el objeto de fecha para int que es unixtime.

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

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

solución rápida y desagradable. Si usted no está haciendo una comparación en términos de fecha anterior o después () y que son simplemente comparando las datestrings, acaba de hacer una rápida toString () en cada uno.

 if (curr.mtime.toString() == prev.mtime.toString()) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top