Vigilar cambios en el disco
Detectar que un fichero ha cambiado por fuera: para qué sirve de verdad, por qué los eventos llegan repetidos, y el patrón que evita el bucle infinito.
Para qué sirve de verdad
Tres casos legítimos, y uno que no lo es:
Lo que hay que saber antes de usarlo
Cuatro cosas que sorprenden a todo el mundo la primera vez:
- Un cambio produce varios eventos. Guardar un fichero desde un editor típico dispara entre dos y cinco avisos —crear, modificar, renombrar, borrar el temporal— porque el editor probablemente usa el patrón atómico del nivel 40.2.
- Los eventos no dicen qué cambió, solo que algo cambió. Hay que releer para saberlo.
- Se pueden perder si llegan muchos de golpe. El sistema tiene una cola con límite.
- Y el comportamiento difiere entre plataformas en los detalles: qué eventos manda cada uno, si vigila subdirectorios de forma nativa, y el coste de vigilar árboles grandes.
De ahí sale la regla de oro: agrupar por tiempo. Nunca reaccionar a un evento suelto:
// agrupar: esperar a que se calme antes de actuarlet mut pendiente: Option<Instant> = None;// en el bucle de eventospendiente = Some(Instant::now());// y en otro sitio, cada 100 msif let Some(t) = pendiente { if t.elapsed() > Duration::from_millis(300) { pendiente = None; recargar_de_verdad(); // una vez, no cinco }}Trescientos milisegundos convierten cinco eventos en una recarga, y el usuario no nota la diferencia.
El bucle
El error que hay que evitar, y es fácil de cometer:
Los límites
Y lo que conviene no hacer:
- No vigiles árboles grandes. Vigilar el directorio personal del usuario recursivamente es caro en las tres plataformas y en algunas tiene límites duros de número de vigilantes.
- No vigiles lo que tú gestionas. La cuarta fila de la tabla.
- Y cuenta el vigilante como recurso: se crea al abrir algo y se cierra al cerrarlo. Un vigilante por fichero abierto que nunca se libera es una fuga que aparece tras horas de uso.