Node.JS: Как работает "fs.watchFile"? - PullRequest
18 голосов
/ 22 марта 2011

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

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

Там также написано

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

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

По умолчанию { persistent: true, interval: 0 }.

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

Ответы [ 2 ]

12 голосов
/ 03 апреля 2011

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

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

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

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

РЕДАКТИРОВАТЬ: это не следует использовать для просмотратонны файлов.В моей системе максимальное значение составляет 8192. Ваше максимальное значение можно найти с помощью этой команды cat /proc/sys/fs/inotify/max_user_watches.Это может быть использовано, чтобы просто посмотреть каталоги на наличие изменений, а затем выяснить отдельные файлы оттуда.Измененное событие сработает, если файл, находящийся непосредственно в этом каталоге, будет изменен.

РЕДАКТИРОВАТЬ: Спасибо @guiomie за указание на то, что просмотр файлов теперь полностью поддерживается в Windows.Я предполагаю, что это с выпуском v0.6.x.

3 голосов
/ 19 апреля 2012

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

...