Saltar al contenido

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:

Rust
// 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.