¿Cómo supervisan la mayoría de los programas de sincronización los cambios de archivos?

9

¿Los programas de sincronización como Dropbox suelen rastrear los cambios de archivos haciendo comparaciones byte a byte, o usando hashes, o usando diff/ manteniendo registros de confirmación locales como control de versiones, o qué?

mcandre
fuente

Respuestas:

8

En Windows, hay un mecanismo para que el sistema operativo le avise cuando hay un cambio en una estructura de directorio 'vigilada': FindFirstChangeNotification (). Cuando eso indica que un archivo ha cambiado, una aplicación puede comparar archivos en el directorio cambiado para encontrar los archivos reales que han cambiado mirando el tamaño, la fecha de modificación, el hash, etc.

Esto (como Michael señala a continuación) es algo que cada plataforma proporcionaría de alguna manera. No decía que este tipo de cosas fuera exclusivo de Windows.

Gran maestro B
fuente
1
Y hay inotify en Linux.
Michael
Pero, ¿qué sucede si el programa de sincronización no se estaba ejecutando en el momento del cambio de archivo? ¿No perdería la oportunidad de ser notificado por el gancho?
mcandre
Usó el ejemplo específico de Dropbox, que generalmente se ejecuta en segundo plano. Obviamente, si el programa no se está ejecutando, no será notificado. Luego tiene que usar otros métodos (fecha de modificación, tal vez). No creo que vaya a obtener una respuesta concreta sobre cuáles son los métodos específicos utilizados, porque los diferentes programas hacen las cosas de manera diferente. Es mejor preguntar a los creadores de los programas específicos en cuestión.
GrandmasterB
@mcandre Más o menos lo que dijo GrandmasterB: si se perdió la notificación, tendría que escanear la carpeta. Dependiendo de cuán "preciso" desee ser, esto puede significar simplemente buscar nuevos archivos y marcas de tiempo / tamaños de archivo modificados (que son relativamente económicos), o en el peor de los casos, comparar todo el archivo. Los programas como rsync suelen mezclar el archivo en fragmentos, por lo que los cambios tempranos en los datos se pueden detectar antes, pero en el peor de los casos (los archivos son idénticos), vas a leerlo todo.
Daniel B
2

En última instancia, para comparar archivos, debe comparar cada byte. ¿De qué otra forma notaría un cambio de un solo byte?

En realidad, lee bloques de bytes y calcula un valor hash, luego verifica con una lista de hash. Un buen ejemplo es " rsync "

Hasta donde sé, Dropbox solo deduce archivos completos, por lo que calculará un hash de todo el archivo para verificar el mismo archivo

Martin Beckett
fuente
1
pst en algunos sistemas de archivos hay una fecha modificada
ratchet freak
1
¿El hashing no crearía un riesgo pequeño pero real de colisiones, lo que da como resultado que un archivo no se sincronice? Dropbox aparentemente usa una implementación de tipo diff. dropbox.com/help/8/en
mcandre
1
@mcandre que suena como si fuera mejor como su propia pregunta.
GrandmasterB
@ratchetfreak: la fecha de modificación, en algunos sistemas, no es necesariamente confiable para este tipo de problema. Un simple toque causaría que la fecha de modificación sea diferente, donde una sincronización puede no ser necesaria.
Steven Evers
1
@SnOrfus a continuación, comprobar el doble de los cambios cuando la fecha de modificación se cambia
trinquete monstruo
1

.NET, por ejemplo, tiene una clase FileSystemWatcher. Estoy seguro de que otros lenguajes y tiempos de ejecución de bajo nivel pueden proporcionar capacidades similares.

Nik
fuente