Detectar cambios de archivos en Node.js vía watchFile
-
25-09-2019 - |
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?
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)
solución rápida y desagradable.
Si usted no está haciendo una comparación en términos de fecha anterior o después (
if (curr.mtime.toString() == prev.mtime.toString())