2009-09-06 9 views

Respuesta

32

La API de FSEvents es ideal si solo desea ver directorios pero no controla la supervisión de archivos individuales. Stu Connolly tiene una gran envoltura de Objective-C para la API FSEvents C, se llama SCEvents y se puede obtener aquí:

http://stuconnolly.com/blog/scevents-011/

Lo bueno de FSEvents es que sólo tiene que ver una carpeta y se será notificado de cualquier cambio que ocurra en cualquier lugar de la jerarquía de la subcarpeta de esa carpeta.

Si necesita notificaciones a nivel de archivo, necesitará usar kqueues. Uli Kusterer tiene una gran envoltura de Objective-C:

http://zathras.de/angelweb/sourcecode.htm#UKKQueue

Cualquiera de estos métodos es mucho más fácil que las disputas con la API de C directamente, que no están particularmente bien documentada y un poco obtuso.

Si necesita dar soporte a Tiger, necesitará usar kqueues ya que la API de FSEvents no estaba disponible oficialmente en 10.4.

+5

Las cosas han cambiado desde Mac OS 10.7 Lion.FSEvents ahora admite la granularidad a nivel de archivo, use el indicador kFSEventStreStreamCreateFlagFileEvents al crear la secuencia de eventos para informarse sobre los cambios a archivos particulares. Guía FSEvent no refleja estos cambios, pero [Referencia] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.html#//apple_ref/c/econst/kFSEventStreamCreateFlagFileEvents) do. –

+0

¿Qué hay de las restricciones de sandbox? ¿Es posible obtener notificaciones para cualquier ruta en el sistema? (Después de que el usuario lo selecciona con el diálogo especial) – Vojto

+0

Buena pregunta. Creo que si seleccionó una carpeta usando 'NSOpenPanel' (es decir, la Powerbox), entonces debería poder observarla para ver cambios sin ningún problema. –

-3

No estoy seguro de cuál es la mejor manera, pero una forma sería iniciar un NSThread que regularmente (por ejemplo cada segundo) verificaría las fechas de creación de los archivos en el directorio y luego tendría un delegado asociado con ese hilo para realizar alguna acción cuando un nuevo archivo ha sido añadido

+11

Eso es un sondeo y no se recomienda. Utilice FSEvents o kqueues en su lugar, que son API diseñadas expresamente para este fin. –

+2

Se desaconseja el poling, sin embargo, también es la única técnica confiable. Poling funcionará * todo * el tiempo, incluso sobre volúmenes de red cuando el archivo es modificado por una máquina diferente. Todos deberían al menos considerar usarlo. –

+0

"única técnica confiable" cuidado para elaborar? Escuchar eventos centrales parece ser la mejor opción. En cuanto a la batería. – eonist

6

Trate de usar FSEvents, aunque es una API C

OS 10.5 o más reciente

+0

Montones de libs de envoltura FSEvent en github en estos días. Incluso para Swift – eonist

1

Si va a cambiar un archivo o una carpeta, creo que el Spotlight el motor de búsqueda actualizará su base de datos para reflejar sus cambios.

Puede configurar un hilo que escuche las notificaciones kMDQueryDidUpdateNotification a través de un Spotlight query específico de ese archivo o carpeta.

Cuando recibe esas notificaciones, puede disparar un selector que hace algo que desea.

+2

Esta es una buena idea, pero el problema con Spotlight es que no todos los volúmenes lo admiten (muchos volúmenes de red en particular) y los usuarios también tienen la costumbre de apagarlo. –

+0

Estos son buenos puntos. Solo pensando en voz alta. –

+0

También puede tener volúmenes en modo privado en el centro de atención. Aunque es bueno tener la idea en la mesa. ¡Pulgares hacia arriba! – eonist

1

Si necesita usar kqueue (como se explica en otras respuestas) Google Toolbox para Mac tiene un nice Objective-C wrapper que he usado sin problemas hasta el momento.

+0

Contenedor KernelQueues en obj-c: https://gist.github.com/nielsbot/5155671 – eonist

Cuestiones relacionadas