¿Cuál es la mejor manera de escuchar una carpeta o archivo para ver si se ha guardado o si se ha agregado un nuevo archivo?Observe un archivo o carpeta en Objective-C
Respuesta
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.
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
Eso es un sondeo y no se recomienda. Utilice FSEvents o kqueues en su lugar, que son API diseñadas expresamente para este fin. –
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. –
"única técnica confiable" cuidado para elaborar? Escuchar eventos centrales parece ser la mejor opción. En cuanto a la batería. – eonist
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.
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. –
Estos son buenos puntos. Solo pensando en voz alta. –
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
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.
Contenedor KernelQueues en obj-c: https://gist.github.com/nielsbot/5155671 – eonist
- 1. Tomar posesión de un archivo o carpeta
- 2. Compruebe si una ruta representa un archivo o una carpeta
- 3. Bloques ObjectiveC equivalente en Java
- 4. Comprobar si un nombre de archivo es una carpeta o un archivo
- 5. ¿Puedo colocar un ObjectiveC @selector en un NSDictionary?
- 6. ¿Cómo incluir un archivo de otra carpeta?
- 7. Cómo copiar un archivo de una carpeta a otra carpeta
- 8. Depuración de Android - Observe los puntos
- 9. ¿Qué es "dreadlock"? (observe la "R")
- 10. objectivec: fb publicar comentario error
- 11. ObjectiveC Parse Integer from String
- 12. ¿Cómo saber qué procesos tienen una carpeta o archivo bloqueado?
- 13. Maven: agregue una carpeta o archivo jar al classpath actual
- 14. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 15. Observe el contenido de cadena muy largo en Eclipse
- 16. carpeta asociada al guardar un archivo html
- 17. Powershell Obtener carpeta principal de un archivo
- 18. Crear un archivo/carpeta oculta en Windows con Java
- 19. ¿Cómo crear un archivo en Java (no en una carpeta)?
- 20. Google Apps Script: ¿Cómo creo un archivo en una carpeta?
- 21. encontrar cadena dentro de un archivo comprimido en una carpeta
- 22. ¿Cómo desbloqueo una carpeta/archivo en Linux?
- 23. Abrir un archivo de la carpeta assets en android
- 24. Acceder al archivo en la carpeta WebContent desde un servlet
- 25. Crear un archivo en la carpeta userfiles (C#, Windows Forms)
- 26. DotLess - ¿Cómo importar un archivo LESS en una carpeta principal?
- 27. ¿Cómo comprobar si un archivo existe en una carpeta?
- 28. crear un archivo de texto en una carpeta
- 29. Abrir una carpeta en el explorador y seleccionar un archivo
- 30. Buscar un archivo con una cierta extensión en la carpeta
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. –
¿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
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. –