Обнаружение изменений файла в node.js через watchFile

Я хочу обнаружить изменения для файла, если файл изменится, я буду использовать child_process для выполнения команды scp для копирования файла на сервер. Я искал документацию node.js, функция fs.watchFile кажется сделайте то, что я хочу сделать, но когда я попробовал, как-то он просто не работает, как я ожидал. Использовался следующий код:

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

С вышеприведенным кодом, если я получаю доступ к просмотренному файлу, функция обратного вызова получает выполнение, он выдает одно и то же mtime и всегда выводит "mtime not equal" (я получаю только доступ к файлу). Выходы:

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

Кто-нибудь знает, почему оператор if сработал (также пытался использовать === идентифицировать проверку, но все равно получить тот же результат), когда два mtime одинаковы?

Ответы

Ответ 1

Если mtime свойства - это объекты Date, то они никогда не могут быть равны. В JavaScript два отдельных объекта равны ТОЛЬКО, если они фактически являются одним и тем же объектом (переменные указывают на один и тот же экземпляр памяти)

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

Чтобы проверить, совпадают ли эти два значения даты, используйте

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

(Я действительно не уверен, что это так, поскольку я не проверял, выводит ли watchFile объекты или строки Date, но это определенно кажется таким образом из вашего описания)

Ответ 2

Для "умных" людей:

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

Ответ 3

К сожалению, правильный способ -

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

Параметр + заставляет объект Date использовать int, который является unixtime.

Ответ 4

Чтобы упростить вещи, вы можете использовать Watchr для получения полезных событий (будет запускаться только событие change, если файл действительно изменился). Он также поддерживает просмотр всего дерева каталогов:)

Ответ 5

Мы используем chokidar для просмотра файлов, который работает даже в сомнительном контексте машины centos, работающей с файловой системой Windows (vagrant virtualbox centos работает на машине Windows)

https://github.com/paulmillr/chokidar

Ответ 6

быстрое и неприятное решение. Если вы не проводите сравнение даты в терминах предыдущего или после (< или > ), и вы просто сравниваете даты, просто выполняйте быстрый toString() на каждом из них.

 if (curr.mtime.toString() == prev.mtime.toString())