Обнаружить изменения файла в Node.js через WatchFile

StackOverflow https://stackoverflow.com/questions/3806488

  •  25-09-2019
  •  | 
  •  

Вопрос

Я хочу обнаружить изменения в файле, если файл меняется, я буду использовать 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");
    }   
});

С приведенным выше кодом, если я получаю доступ к наблюдающемуся файлу, функция обратного вызовов GEL EXEATE, она выводила одно и то же MTime, и всегда выводится «mime не равна» (я только получаю доступ к файлу). Выходы:

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 свойства 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 Выводы даты объектов или строк, но это определенно кажется таким образом от вашего описания)

Другие советы

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

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

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

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

+ Усиливает объект даты для INT, который является UnixTime.

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

Мы используем Chokidar для просмотра файлов, который работает даже в сомнительном контексте CentOS-машины, работающего с файловой системой Windows (Varrant Virtualbox CentoS работает на станке Windows)

https://github.com/paulmillr/chokidar.

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

 if (curr.mtime.toString() == prev.mtime.toString()) 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top