El tema lo dice todo: normalmente, la manera fácil y cruzada es sondear, inteligentemente. Pero cada sistema operativo tiene algunos medios para notificar sin votación. ¿Es posible de una manera bastante cruzada? (Solo me preocupo por Windows y Linux, pero uso Mac, entonces pensé que posix podría ayudar?)Cómo ser notificado de cambio de archivo/directorio en C/C++, idealmente usando POSIX
Respuesta
usuarios de Linux pueden utilizar inotify
inotify es un subsistema del kernel de Linux que proporciona de eventos del sistema de archivos notificación.
Algunas golosinas para Windows becarios:
- File Change Notification en MSDN
- "When Folders Change" artículo
- File System Notification on Change
No creo que POSIX tenga las herramientas para eso. Lo más parecido a multiplataforma que he visto es FAM, que parece funcionar para Linux, BSD e Irix, pero no soy lo fácil que sería portarlo a Windows y MacOS.
Creo que OS X ahora tiene ganchos/devoluciones de llamada apropiados porque fueron necesarios para la indexación de Spotlight.
En Linux tendrá el problema adicional de que hay varios sistemas de archivos de uso común. Si necesita la funcionalidad solo para una cantidad limitada de archivos/directorios, trataría de buscar activamente modificaciones a intervalos regulares.
La biblioteca Qt tiene una clase QFileSystemWatcher que proporciona notificaciones de plataforma cruzada cuando un archivo cambia Incluso si no está utilizando Qt, porque la fuente está disponible, podría echarle un vistazo como muestra para su propia implementación. Qt tiene implementaciones separadas para Windows, Linux y Mac.
Hay
File System Events API
como de Leopard.
En realidad, he desarrollado este sistema antes para utilizarlo en una base de código comercial C++; siempre que no necesite todo lo extraño bajo el sol, los sistemas Windows y POSIX tienen mucha superposición que puede abstraer.
POSIX: Use inotify: es un sistema completo construido literalmente para este trabajo
Windows: utilice "eventos de cambio". Tienes que construir más pegamento e informarte (todas las API que necesitas están disponibles, simplemente no te da la opción 1-stop-shopping inotify).
Las cosas comunes que se pueden detectar en su "hilo de notificación" para la transmisión de eventos son:
1) Básicamente cualquier operación invasiva impulso :: sistema de archivo soporta, con la posible excepción() de permisos de modificación. Esto es cosas como mover, crear, borrar, copiar carpetas y archivos.
2) Lee y escribe en archivos (especialmente escrituras). Tenga en cuenta que si está utilizando la E/S asíncrona, las notificaciones pueden aparecer desordenadas.
3) Cuando aparece un nuevo volumen, como alguien conectando una unidad flash.
inotify, especialmente, le ofrece un nivel insano de control fino, Windows menos. Con inotify puede controlar literalmente todo lo que el sistema de archivos está haciendo en tiempo casi real si realmente lo desea. Sé que el # 3 es posible con ambos sin votación, pero tenga en cuenta que puede ser realmente complicado hacer que funcione correctamente, en cualquier sistema.
- 1. Ser notificado de llamadas a métodos en .NET
- 2. Cómo ser notificado cuando scrollToRowAtIndexPath termina la animación
- 3. ¿Cómo ser notificado cuando se cierra un SocketChannel?
- 4. Escaneo de archivos en la memoria, idealmente usando ClamAV
- 5. Ser notificado cuando el niño visual/lógico agregado/eliminado
- 6. Detalles de call/cc
- 7. ¿Qué es call/cc?
- 8. ¿Cómo cambian DP y CC en Piet?
- 9. ¿Funciona el evento Application.ApplicationExit para ser notificado de la salida en aplicaciones que no son Winforms?
- 10. ¿Cómo puedo ser notificado de un problema de VCS en un servidor de compilación de team city?
- 11. ¿Cómo marcar una matriz en POSIX sh?
- 12. ¿Cómo podemos ser notificado si el teléfono tiene acceso a Internet?
- 13. ¿Cómo cambio directorios usando Paramiko?
- 14. Cambio de programación de la configuración del enrutador inalámbrico: idealmente, Netgear
- 15. cómo instalar POSIX en php
- 16. ¿Alguna forma de ser notificado cuando algo se suscribe a un evento/delegado?
- 17. Al ser notificado asincrónicamente de un BlockingQueue que tiene un artículo disponible
- 18. Usando "y" a cambio
- 19. patrones "call-cc" en Scala?
- 20. ¿Hay alguna manera en el depurador de Eclipse de ser notificado cuando cambia el estado de un objeto de Java?
- 21. Usando || en Cambio de caja en rieles
- 22. PHP Mail, CC Field
- 23. ¿Cómo obtener espacio de disco total disponible en sistemas Posix?
- 24. Cambio de XML usando .Net
- 25. Cómo hacer que CC-Tray funcione
- 26. Cómo "aplicar" caracteres de retroceso dentro de un archivo de texto (idealmente en vim)
- 27. S_IRUSR semántica en POSIX
- 28. Cómo "ralentizar" un archivo MIDI (idealmente en Python)?
- 29. Continuación (call/cc) en el Esquema
- 30. Proceso de horquillas con CC .NET
Sí, pude hacerlo funcionar para eso. Es un poco extraño, con una lectura de bloqueo() - pero al menos no hay latencia (¡más bien, no hay sondeo!). –