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?

È stato utile?

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)

https://github.com/paulmillr/chokidar

soluzione rapida e brutto. Se non stai facendo un confronto in termini di data precedente o dopo () e si sono semplicemente confrontando i datestrings, basta fare un rapido toString () su ciascuno di essi.

 if (curr.mtime.toString() == prev.mtime.toString()) 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top