2009-11-20 10 views
26

Deseo que se notifique mi código cuando se modifique cualquier archivo bajo (directa o indirectamente) de un directorio determinado. Con "modificado", quiero decir que quiero que se notifique mi código siempre que se modifique el contenido de un archivo, se renombre o se elimine; o si se agrega un nuevo archivo. Para mi aplicación, puede haber miles de archivos.Notificación de cambio del sistema de archivos a nivel de archivos en Mac OS X

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. Solo le dice que algo en el directorio ha cambiado, pero no le dice qué cambió.

También dice:

El archivo de eventos del sistema API también no está diseñado para encontrar a cabo cuando un cambios en los archivos particulares. Para tales propósitos, el mecanismo de kqueues es más apropiado.

Sin embargo, para usar kqueue en un archivo dado, hay que abrir el archivo para obtener un descriptor de archivo. No es práctico administrar miles de descriptores de archivos (y probablemente excedan la cantidad máxima permitida de descriptores de archivos abiertos de todos modos).

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

¿Cómo puedo hacer lo que quiero con Mac OS X? O bien, preguntado de otra manera: ¿cómo se puede escribir el equivalente de ReadDirectoryChangesW() para Mac OS X en el espacio de usuario (y hacerlo de manera muy eficiente)?

Respuesta

6

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 the description of FSEventStreamCreateFlags:

kFSEventStreamCreateFlagFileEvents

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

Disponible en OS X v10.7 y posterior.

8

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 Watcher. No es lo que estás buscando, pero es lo mejor que puedes hacer en este momento. Debe tomar instantáneas del directorio y volver a examinarlo cuando descubra que algo ha cambiado. El tiempo de modificación es lo mejor para verificar, por supuesto, si puede confiar en el tiempo de modificación.

Probablemente tenga razón en que intentar registrarse para un número ilimitado de kqueues probablemente no sea viable.

+0

En general, no me gusta la programación de Windows y prefiero mucho la programación Mac/Linux. Parece extraño que aparentemente haya al menos 1 cosa más fácil de hacer en Windows. –

+3

Oh, hay muchas cosas más fáciles de hacer en Windows. Intenta hablar con SOAP usando Cocoa. NSArray es agradable, pero a veces un genérico de C# sería muy bienvenido. Mac no tiene nada ni cerca de ASP.NET (te estoy mirando, WebObjects). Amo a Cocoa; es de lejos el mejor marco que he encontrado. Pero cualquiera que piense que todo es mejor para los desarrolladores en Mac que en Windows no se ha desarrollado mucho en ambos. Para cosas como esta, todos estamos esperando el santo grial de zfs, lo que puede hacer que este tipo de cosas sea más fácil y más rápido. Algún día ... (Microsoft también tiene sus sueños de winfs ...) –

+1

El problema es que estás agrupando la programación de Linux con la programación de Mac. Esto es muy fácil de hacer en Linux con inotifywait. – MarkovCh1

-2

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

2

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

Cuestiones relacionadas