2011-03-22 26 views
17

De acuerdo con la API docs for Node 0.4.3, la función fs.watchFile(filename, [options], listener) comienza una rutina queNode.JS: ¿Cómo funciona "fs.watchFile"?

observar los cambios en filename. Se llamará al oyente callback cada vez que se acceda al archivo.

También dice

El options si se proporciona debe ser un objeto que contiene dos miembros de un booleano, persistent, y interval, un valor de votación en milisegundos

que indica que así será revise de vez en cuando en función de lo que está dentro del intervalo. Pero también dice

El valor predeterminado es { persistent: true, interval: 0 }.

¿Significa eso que comprobará cada milisegundo para ver si se modificó la hora del archivo? ¿Escucha los eventos de nivel del sistema operativo? ¿Cómo funciona?

+1

Creo que este es un duplicado de http://stackoverflow.com/questions/4482352/node-js-fs-watchfile-persistent-watch-mechanics –

+0

Ver la respuesta de tjameson: Si bien puede ser un duplicado, la respuesta proporcionada en esa vieja pregunta está desactualizada. Creo que a partir de 2013 hay muchas más soluciones modernas. –

+0

Vale la pena señalar que en el nodo v6 el valor predeterminado es '{persistente: verdadero, intervalo: 5007}'. Un intervalo de 0 no tiene sentido lógico.No parece que esto fuera cierto en el momento en que se hizo la pregunta, pero [la implementación actual en la fuente C] (https://github.com/nodejs/node/blob/db1087c9757c31a82c50a1eba368d8cba95b57d0/deps/uv/src/ fs-poll.C# L77) cambia de 0 a 1: 'ctx-> interval = interval? intervalo: 1; '. – Nateowami

Respuesta

12

Sí, cpedros es correcto, esto parece ser un duplicado. Creo que puedo arrojar más luz sobre esto sin embargo.

Cada sistema operativo tiene su propio evento de cambio de archivo que se activa. En Linux, es inotify (solía ser dnotify), en Mac es fsevents, y en Windows es FileSystemWatcher. No estoy seguro de si el código subyacente maneja cada caso, pero esa es la Idea general.

Si solo quiere ver un archivo en Linux, recomiendo node-inotify-plus-plus. Si desea ver un directorio, use inotify-plus-plus con node-walk. Lo he implementado y funcionó a las mil maravillas.

Puedo publicar un código si está interesado. La belleza detrás de node-inotify-plus-plus es que abstrae gran parte de la maldad de inotify y ofrece una API intuitiva para escuchar eventos específicos en un archivo.

EDITAR: Esto no se debe utilizar para ver toneladas de archivos. En mi sistema, el máximo es 8192. Su máximo se puede encontrar usando este comando cat /proc/sys/fs/inotify/max_user_watches. Esto podría usarse para simplemente mirar directorios de cambios y luego descubrir los archivos individuales desde allí. Un evento modificado se activará si se modifica un archivo directamente debajo de ese directorio.

EDITAR: Gracias @guiomie por señalar que la visualización de archivos ahora es totalmente compatible con Windows. Supongo que esto es con la versión v0.6.x.

+0

Esto se está probando en Cygwin (emulador de Unix) en Windows, y finalmente se usará en Solaris. –

+1

Node.js solo es compatible con Linux, creo, por lo que probablemente esté realizando algún tipo de sondeo en el que inotify no sea compatible. – tjameson

+0

@tjameson: ¿Quiere decir que ** la escucha del sistema de archivos ** solo es compatible con Linux? [Las instrucciones de instalación] (https://github.com/joyent/node/wiki/Installation) dicen que * "Node debe instalarse de fábrica en Linux, Macintosh y Solaris" *. Lo que indica que ** es compatible ** en Mac, Solaris. Tal vez deberías ** reformular? ** –

3

Para ampliar la fantástica respuesta de tjameson, puede usar watchr para normalizar la API entre la versiós del nodo y las diferencias de observación del sistema operativo. También proporciona eventos para unlink y new en lugar de solo change, y también agrega soporte para la observación del árbol de directorios.