usando ubicacion tienes tiene siguientes sierra requieren puede porque permisos permiso para operación necesario mac los high guardar esta elementos elemento completar carpeta cambiar archivos archivo algunos adicionales acceder abrir macos fsevents readdirectorychangesw kqueue

macos - ubicacion - Notificación de cambio de sistema de archivos a nivel de archivo en Mac OS X



no tiene permiso para guardar archivos en esta ubicacion excel mac (4)

Quiero que se notifique a mi código cuando se modifique cualquier archivo bajo (directa o indirectamente) un directorio determinado. Por "modificado", quiero decir que quiero que se notifique a mi código cada vez que se modifique el contenido de un archivo, se cambie su nombre o se elimine; o si se agrega un nuevo archivo. Para mi aplicación, puede haber miles de archivos.

Miré como FSEvents, pero su Descripción de la tecnología dice, en parte:

El punto importante que se debe quitar es que la granularidad de las notificaciones se encuentra en un nivel de directorio. Solo le dice que algo en el directorio ha cambiado, pero no le dice qué ha cambiado.

También dice:

La API de eventos del sistema de archivos tampoco está diseñada para descubrir cuándo cambia un archivo en particular. Para tales propósitos, el mecanismo kqueues es más apropiado.

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

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

Entonces, ¿cómo se puede hacer lo que quiero bajo Mac OS X? O, preguntado de otra manera: ¿cómo se podría escribir el equivalente de ReadDirectoryChangesW() para Mac OS X en el espacio de usuario (y hacerlo de manera muy eficiente)?


EDIT: No verificado, pero Konstantin indica a continuación que este ejemplo de código está obsoleto a partir de 2012.

No creo que haya una API específica para lo que estás buscando. Apple proporciona un código de muestra para un problema similar llamado Watcher . No es lo que está buscando, pero es lo mejor que puede hacer en este momento. Debe tomar instantáneas del directorio y volver a escanearlo cuando descubra que algo ha cambiado. Por supuesto, lo mejor es verificar el tiempo de modificación, si puede confiar en el tiempo de modificación.

Probablemente tenga razón al intentar no registrarse para un número ilimitado de kqueues.


Es posible que desee revisar man fs_usage , aunque no es específico de un directorio y requiere privilegios de root.


La utilidad más cercana (que yo sepa) que satisface sus necesidades en Mac OS X es fslogger . Vea el enlace para una descripción, dmg y código fuente: OSXBook - fslogger


No lo he intentado yo mismo, pero parece que FSEvents puede proporcionar notificaciones a nivel de archivo a partir de 10.7 (Lion). De la descripción de FSEventStreamCreateFlags :

kFSEventStreamCreateFlagFileEvents

Solicitar notificaciones a nivel de archivo. Su transmisión recibirá eventos sobre archivos individuales en la jerarquía que está viendo en lugar de recibir solo notificaciones de nivel de directorio. Use esta bandera con cuidado ya que generará significativamente más eventos que sin ella.

Disponible en OS X v10.7 y posteriores.