Frage

Ich möchte Änderungen für eine Datei erfassen, wenn die Datei ändert, werde ich child_process verwenden, um einen Befehl scp auszuführen, um die Datei zu kopieren, um eine server.I nachgeschlagen node.js Dokumentation, die fs.watchFile Funktion scheint das tun, was ich möchte zu tun, aber wenn ich es versuchte, irgendwie ist es funktioniert einfach nicht, wie ich erwartet hatte. Der folgende Code verwendet:

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");
    }   
});

Mit obigem Code, wenn ich die beobachtete Datei zugreifen, erhält die Callback-Funktion ausführen, gibt er die gleiche mtime, und immer Ausgang „mtime nicht gleich“ (ich die Datei nur Zugriff). Ausgänge:

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

Jeder weiß, warum die if-Anweisung ist fehlgeschlagen (auch versucht, mit Scheck === zu identifizieren, aber immer noch die gleiche Leistung erhalten), wenn die beiden mtime gleich sind?

War es hilfreich?

Lösung

Wenn mtime Eigenschaften Date Objekte sind, können diese nie gleich sein. In JavaScript zwei separate Objekte sind gleich, nur wenn sie tatsächlich das gleiche Objekt sind (Variablen auf die gleiche Speicher Instanz verweisen)

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

Um zu überprüfen, ob diese beiden Datumswerte sind die gleichen, die Verwendung

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

(Ich bin nicht wirklich sicher, ob dies der Fall ist, da ich nicht, ob watchFile Ausgänge Date-Objekte oder Zeichenkette habe zu überprüfen, aber es scheint auf jeden Fall auf diese Weise aus Ihrer Beschreibung)

Andere Tipps

Für "clever" Menschen:

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

Leider ist der richtige Weg

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

Die + Kräfte des Date-Objekt int, die Unix-Zeit ist.

Dinge vereinfachen Sie Watchr verwenden können nützliche Veranstaltungen zu bekommen (nur das change Ereignis ausgelöst, wenn ein Datei tatsächlich geändert). Es unterstützt auch ganze Verzeichnisbäume zu beobachten:)

Wir chokidar für Datei verwenden zu beobachten, die auch in dem fragwürdigen Rahmen einer CentOS Maschine mit einem Windows-Dateisystem (vagrant virtualbox CentOS läuft auf Windows-Rechner)

Laufen funktioniert

https://github.com/paulmillr/chokidar

schnell und böse Lösung. Wenn Sie kein Datum Vergleich in Bezug auf die vorherige oder nach () tun, und Sie sind einfach die datestrings zu vergleichen, einfach eine schnelle toString () auf jedem.

 if (curr.mtime.toString() == prev.mtime.toString()) 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top