Pregunta

Quiero mi código para ser notificado cuando cualquier archivo bajo (directa o indirectamente) un directorio dado se modifica. Por "modificado", quiero decir que quiero que mi código para ser notificado cada vez que el contenido de un archivo se alteran, se cambió el nombre, o no lo elimina; o si se añade un nuevo archivo. Para mi solicitud, no puede haber miles de archivos.

Miré como FSEvents, pero su general Tecnología dice, en parte:

  

El punto importante para llevar es que la granularidad de notificaciones se encuentra en un nivel de directorio. Se da a conocer solamente de que algo en el directorio ha cambiado, pero no le dice lo que ha cambiado.

También dice:

  

La eventos del sistema de archivos API tampoco está diseñado para encontrar a cabo cuando un cambios en los archivos particulares. Para tales fines, el mecanismo de kqueues es más apropiado.

Sin embargo, con el fin de utilizar kqueue en un archivo dado, uno tiene que abrir el archivo para obtener un descriptor de archivo. No es práctico para gestionar miles de descriptores de archivos (y probablemente superar el número máximo permitido de descriptores de archivos abiertos de todos modos).

Curiosamente, bajo Windows, puedo usar la función ReadDirectoryChangesW() y lo hace precisamente lo que quiero.

Entonces, ¿cómo puede uno hacer lo que quiero en Mac OS X? O bien, se le preguntó otra manera: ¿cómo se van a escribir el equivalente de ReadDirectoryChangesW() para Mac OS X en el espacio de usuario (y lo hacen de manera muy eficiente)

?
¿Fue útil?

Solución

No he probado esto por mí mismo, pero parece que FSEvents es capaz de proporcionar notificaciones a nivel de archivo como de 10.7 (Lion). De la descripción de FSEventStreamCreateFlags :

  

kFSEventStreamCreateFlagFileEvents

     

notificaciones de solicitud de nivel de archivo. Su corriente recibirá eventos sobre los archivos individuales en la jerarquía que está viendo en lugar de solamente recibir notificaciones de nivel de directorio. Utilice esta marca con cuidado ya que generará significativamente más eventos que sin él.

     

Disponible en OS X 10.7 y posteriores.

Otros consejos

EDIT: No verificado, pero Konstantin indica a continuación que este ejemplo de código es obsoleta a partir de 2012

.

No creo que hay una API específica para lo que estás buscando. Apple proporciona código de ejemplo para un problema similar llamado Vigía . No es lo que está buscando, pero es lo mejor que se puede hacer en este momento. Usted tiene que tomar instantáneas del directorio, y volver a examinar cuando se entera de algo cambió. tiempo de modificación es el mejor que se puede comprobar, por supuesto, si se puede confiar en la fecha de modificación.

Usted es probablemente correcto que intentar registrarse para un número ilimitado de kqueues probablemente sería inviable.

La utilidad más cercano (que yo sepa) que satisfaga sus necesidades en Mac OS X es fslogger. Ver el enlace de un código de descripción, DMG y fuente: OSXBook - fslogger

Es posible que desee echa un vistazo a man fs_usage, aunque no es específica de un directorio y no requiere privilegios de root.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top