Подтвердить что ты не робот

Node.JS: Как работает "fs.watchFile"?

В соответствии с API-документами для Node 0.4.3 функция fs.watchFile(filename, [options], listener) запускает процедуру, которая будет

Следите за изменениями на filename. Слушатель callback будет вызываться каждый раз, когда к файлу обращаются.

В нем также говорится

options Если это предусмотрено, должен быть объект, содержащий два элемента: boolean, persistent и interval, значение опроса в миллисекундах

Это означает, что он будет проверять каждый так часто, исходя из того, что находится в интервале. Но он также говорит

По умолчанию используется { persistent: true, interval: 0 }.

Значит ли это, что он проверит каждую миллисекунду, чтобы узнать, изменилось ли время файла? Слушает ли он события уровня ОС? Как это работает?

4b9b3361

Ответ 1

Да, cpedros верен, это похоже на дубликат. Я думаю, что я могу пролить немного света на это, хотя.

Каждая ОС имеет свое собственное событие изменения файла, которое запускается. В Linux он isotify (используется для dnotify), на Mac это fsevents, а в Windows это FileSystemWatcher. Я не уверен, что основной код обрабатывает каждый случай, но что общая идея.

Если вы просто хотите посмотреть файл в Linux, я рекомендую node -inotify-plus-plus. Если вы хотите посмотреть каталог, используйте inotify-plus-plus с node-walk. Я реализовал это, и он работал как шарм.

Я могу опубликовать код, если вам интересно. Красота node -inotify-plus-plus заключается в том, что он абстрагирует большую часть гадости inotify и дает интуитивно понятный API для прослушивания определенных событий в файле.

EDIT: Это не должно использоваться для просмотра тонны файлов. В моей системе максимальное значение - 8192. Максимальное значение можно найти с помощью этой команды cat /proc/sys/fs/inotify/max_user_watches. Это можно использовать, чтобы просто просматривать каталоги для изменений, а затем определять отдельные файлы. Модифицированное событие будет срабатывать, если файл, находящийся непосредственно под этим каталогом, будет изменен.

EDIT: Спасибо @guiomie за указание, что просмотр файлов теперь полностью поддерживается в Windows. Я предполагаю, что это с выпуском v0.6.x.

Ответ 2

Чтобы расширить фантастический ответ tjameson, вы можете использовать watchr для нормализации API между версиями node versiosn и OS. Он также предоставляет события для unlink и new вместо change, а также добавляет поддержку просмотра дерева каталогов.