texto - Cómo ser notificado de cambio de archivo/directorio en C/C++, idealmente usando POSIX
libreria fstream c++ (7)
Creo que OS X ahora tiene ganchos / devoluciones de llamada apropiados porque fueron necesarios para la indexación de Spotlight.
En Linux tendrás el problema adicional de que hay varios sistemas de archivos comúnmente utilizados. Si necesita la funcionalidad solo para una cantidad limitada de archivos / directorios, trataría de buscar activamente modificaciones a intervalos regulares.
El sujeto lo dice todo, normalmente fácil y de manera cruzada es sondear, de forma inteligente. 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, ¿por qué pensé que Posix podría ayudar?)
De hecho, he construido este sistema para su uso en una base de código comercial C ++, siempre y cuando 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, literalmente construido para este trabajo
Windows: usa "cambiar eventos". 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 puedes detectar en tu "cadena de notificaciones" para reenviar eventos son:
1) Básicamente cualquier operación invasiva boost :: filesystem admite, con la (posible) excepción de la modificación de permisos. 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 entra un volumen nuevo, como alguien conectando una unidad flash.
inotify especialmente te da 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.
Hay una API de eventos del sistema de archivos a partir de Leopard.
La biblioteca Qt tiene una clase QFileSystemWatcher que proporciona notificaciones multiplataforma cuando cambia un archivo. 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.
Los usuarios de Linux pueden usar inotify
inotify es un subsistema de kernel de Linux que proporciona notificaciones de eventos del sistema de archivos.
Algunos regalos para los becarios de Windows:
No creo que POSIX tenga instalaciones 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.