Détecter les changements de fichiers dans Node.js via watchfile
-
25-09-2019 - |
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?
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)
solution rapide et méchant.
Si vous ne faites pas une comparaison de date en termes de précédent ou après (
if (curr.mtime.toString() == prev.mtime.toString())