Rileva modifiche apportate ai file in node.js via watchFile
-
25-09-2019 - |
Domanda
Voglio rilevare le modifiche di un file, se il file cambia, userò child_process per eseguire un comando SCP per copiare il file in una server.I alzò gli occhi node.js documentazione, la funzione fs.watchFile sembra fare quello io voglio fare, ma quando l'ho provato, in qualche modo semplicemente non funziona come mi aspettavo. Il seguente codice sono stati utilizzati:
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 il codice di cui sopra, se l'accesso al file guardato, la funzione di callback ottenere l'esecuzione, il risultato sarà lo stesso mtime, e sempre di uscita "mtime non uguale" (Ho solo l'accesso al file). Uscite:
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
Qualcuno sa il motivo per cui l'istruzione if non è riuscita (provato anche utilizzando === identificare controllo, ma ancora ottenere lo stesso risultato) quando i due mtime sono la stessa cosa?
Soluzione
Se le proprietà mtime
sono oggetti Date
, allora questi non potranno mai essere uguali. In JavaScript due oggetti separati sono uguali solo se sono in realtà lo stesso oggetto (variabili puntano alla stessa istanza 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
Per verificare se questi due valori di data sono gli stessi, uso
curr.mtime.getTime() == prev.mtime.getTime();
(Io non sono realmente sicuro se questo è il caso, poiché non ho controllato se watchFile
uscite oggetti Date o stringhe, ma sembra decisamente in questo modo dalla tua descrizione)
Altri suggerimenti
Per le persone "intelligenti":
if (curr.mtime - prev.mtime) {
// file changed
}
Purtroppo il modo corretto è
if (+curr.mtime === +prev.mtime) {}
Le forze di + l'oggetto Date a int che è unixtime.
Per semplificare le cose si possono utilizzare Watchr per ottenere eventi utili (scatterà solo l'evento change
se un file è effettivamente cambiato). Supporta anche guardare interi alberi di directory:)
Usiamo chokidar per il file a guardare, che funziona anche in dubbia contesto di una macchina CentOS in esecuzione con un file system di Windows (CentOS vagabondo VirtualBox in esecuzione sul computer Windows)
soluzione rapida e brutto.
Se non stai facendo un confronto in termini di data precedente o dopo (
if (curr.mtime.toString() == prev.mtime.toString())