Comment la plupart des programmes de synchronisation surveillent-ils les modifications de fichiers?
9
Les programmes de synchronisation comme Dropbox suivent-ils généralement les modifications de fichiers en effectuant des comparaisons octet par octet, ou en utilisant des hachages, ou en utilisant diff/ conservant des journaux de validation locaux comme le contrôle de version, ou quoi?
Sous Windows, il existe un mécanisme permettant au système d'exploitation de vous alerter en cas de modification d'une structure de répertoire «surveillée» - FindFirstChangeNotification (). Lorsque cela indique qu'un fichier a changé, une application peut alors comparer les fichiers du répertoire modifié pour trouver les fichiers réels qui ont changé en regardant la taille, la date modifiée, le hachage, etc.
Ceci (comme Michael le souligne ci-dessous) est quelque chose que chaque plate-forme fournirait d'une manière ou d'une autre. Je ne disais pas que ce genre de chose était unique à Windows.
Mais que faire si le programme de synchronisation n'était pas en cours d'exécution au moment du changement de fichier? Ne manquerait-il pas l'occasion d'être averti par le crochet?
mcandre
Vous avez utilisé l'exemple spécifique de dropbox, qui s'exécute généralement en arrière-plan. De toute évidence, si le programme n'est pas en cours d'exécution, il ne sera pas notifié. Ensuite, il doit utiliser d'autres méthodes (date modifiée, peut-être). Je ne pense pas que vous allez obtenir une réponse concrète sur les méthodes spécifiques utilisées, car différents programmes font les choses différemment. Mieux vaut demander aux créateurs des programmes spécifiques en question.
GrandmasterB
@mcandre À peu près ce que GrandmasterB a dit - si vous avez manqué la notification, vous devrez scanner le dossier. Selon le degré de «précision» que vous souhaitez, cela peut signifier simplement rechercher de nouveaux fichiers et des horodatages / tailles de fichier modifiés (ceux-ci sont relativement peu coûteux à faire), ou dans le pire des cas, comparer le fichier entier. Des programmes comme rsync hachent généralement le fichier en morceaux, donc les modifications au début des données peuvent être détectées plus tôt, mais dans le pire des cas (les fichiers sont identiques), vous allez lire le tout.
Daniel B
2
En fin de compte, pour comparer les fichiers, vous devez comparer chaque octet - sinon, comment remarqueriez-vous un changement d'un seul octet?
En réalité, vous lisez des blocs d'octets et calculez une valeur de hachage, puis vous comparez à une liste de hachages. Un bon exemple est " rsync "
Pour autant que je sache, dropbox dédouble uniquement des fichiers entiers, donc calculera un hachage de tout le fichier pour vérifier le même fichier
pst sur certains systèmes de fichiers, il y a une date modifiée
ratchet freak
1
Le hachage ne créerait-il pas un risque de collision faible mais réel, entraînant la non-synchronisation d'un fichier? Dropbox utilise apparemment une implémentation de type diff. dropbox.com/help/8/en
mcandre
1
@mcandre qui sonne comme ce serait mieux de sa propre question.
GrandmasterB
@ratchetfreak: la date de modification, sur certains systèmes, n'est pas nécessairement fiable pour ce type de problème. Une simple touche entraînerait une date de modification différente, où une synchronisation pourrait ne pas être réellement nécessaire.
Steven Evers
1
@SnOrfus vérifie ensuite les changements lorsque la date de modification est modifiée
ratchet freak
1
Par exemple, .NET a une classe FileSystemWatcher. Je suis sûr que d'autres langages et temps d'exécution de bas niveau peuvent fournir des capacités similaires.
En fin de compte, pour comparer les fichiers, vous devez comparer chaque octet - sinon, comment remarqueriez-vous un changement d'un seul octet?
En réalité, vous lisez des blocs d'octets et calculez une valeur de hachage, puis vous comparez à une liste de hachages. Un bon exemple est " rsync "
Pour autant que je sache, dropbox dédouble uniquement des fichiers entiers, donc calculera un hachage de tout le fichier pour vérifier le même fichier
la source
Par exemple, .NET a une classe FileSystemWatcher. Je suis sûr que d'autres langages et temps d'exécution de bas niveau peuvent fournir des capacités similaires.
la source