Question

Je veux détecter les changements d'un fichier, si les modifications du fichier, je vais utiliser child_process pour exécuter une commande scp pour copier le fichier sur un server.I regardé la documentation de Node.js, la fonction fs.watchFile semble faire ce que Je veux faire, mais quand je l'ai essayé, d'une certaine manière, il ne fonctionne pas comme je m'y attendais. Le code suivant ont été utilisés:

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

Avec le code ci-dessus, si j'accéder au fichier surveillé, la fonction de rappel s'exécuter, il affichera le même mtime, et toujours sortie « mtime Different » (je ne l'accès au fichier). Sorties:

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

Quelqu'un sait pourquoi l'instruction if a échoué (également essayé d'utiliser === identifier contrôle, mais toujours obtenir la même sortie) lorsque les deux mtime sont les mêmes?

Était-ce utile?

La solution

Si les propriétés de mtime sont des objets Date, alors ceux-ci ne peuvent jamais être égaux. JavaScript deux objets distincts sont égaux seulement si elles sont en fait le même objet (les variables pointent vers la même instance de mémoire)

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

Pour vérifier si ces deux valeurs de date sont les mêmes, utilisez

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

(je ne suis pas vraiment sûr que ce soit le cas puisque je ne l'ai pas vérifié si les sorties watchFile objets de date ou des chaînes, mais il semble certainement cette façon de votre description)

Autres conseils

Pour les "intelligents":

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

Malheureusement, la manière correcte est

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

Le + force l'objet Date int qui est unixtime.

Pour simplifier les choses, vous pouvez utiliser Watchr pour obtenir des événements utiles (ne se déclenche l'événement change si un fichier a réellement changé). Il soutient également regarder des arbres entiers du répertoire:)

Nous utilisons chokidar pour le fichier regarder, qui fonctionne même dans le contexte douteux d'une machine à CentOS fonctionnant avec un système de fichiers Windows (CentOS errante virtualbox fonctionnant sur la machine windows)

https://github.com/paulmillr/chokidar

solution rapide et méchant. Si vous ne faites pas une comparaison de date en termes de précédent ou après () et vous comparez simplement les datestrings, il suffit de faire un sur chacun toString rapide ().

 if (curr.mtime.toString() == prev.mtime.toString()) 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top