Wie überwachen die meisten Synchronisierungsprogramme Dateiänderungen?
9
Verfolgen Synchronisierungsprogramme wie Dropbox normalerweise Dateiänderungen, indem sie byteweise Vergleiche durchführen, Hashes verwenden oder difflokale Festschreibungsprotokolle wie die Versionskontrolle verwenden / aufbewahren, oder was?
Unter Windows gibt es einen Mechanismus, mit dem das Betriebssystem Sie benachrichtigt, wenn eine 'überwachte' Verzeichnisstruktur geändert wird - FindFirstChangeNotification (). Wenn dies anzeigt, dass sich eine Datei geändert hat, kann eine Anwendung Dateien im geänderten Verzeichnis vergleichen, um die tatsächlich geänderten Dateien anhand der Größe, des Änderungsdatums, des Hashs usw. zu ermitteln.
Dies (wie Michael weiter unten ausführt) ist etwas, das jede Plattform auf irgendeine Weise bereitstellen würde. Ich habe nicht gesagt, dass so etwas nur bei Windows vorkommt.
Was aber, wenn das Synchronisierungsprogramm zum Zeitpunkt des Dateiwechsels nicht ausgeführt wurde? Würde es nicht die Gelegenheit verpassen, vom Haken benachrichtigt zu werden?
Mcandre
Sie haben das spezielle Beispiel einer Dropbox verwendet, die im Allgemeinen im Hintergrund ausgeführt wird. Wenn das Programm nicht ausgeführt wird, wird es natürlich nicht benachrichtigt. Dann muss es andere Methoden verwenden (Änderungsdatum vielleicht). Ich glaube nicht, dass Sie eine konkrete Antwort darauf erhalten werden, welche spezifischen Methoden verwendet werden, da verschiedene Programme die Dinge unterschiedlich machen. Fragen Sie lieber die Ersteller der jeweiligen Programme.
Großmeister
@mcandre So ziemlich das, was GrandmasterB gesagt hat - wenn Sie die Benachrichtigung verpasst haben, müssen Sie den Ordner scannen. Je nachdem, wie "genau" Sie sein möchten, kann dies bedeuten, einfach nach neuen Dateien und geänderten Zeitstempeln / Dateigrößen zu suchen (diese sind relativ kostengünstig) oder im schlimmsten Fall die gesamte Datei zu vergleichen. Programme wie rsync hashen die Datei normalerweise in Blöcken, sodass frühzeitige Änderungen an den Daten früher erkannt werden können. Im schlimmsten Fall (Dateien sind identisch) lesen Sie das Ganze ein.
Daniel B
2
Um Dateien zu vergleichen, müssen Sie letztendlich jedes Byte vergleichen - wie würden Sie sonst eine einzelne Byteänderung bemerken?
In der Realität lesen Sie Byteblöcke und berechnen einen Hashwert. Anschließend prüfen Sie anhand einer Liste von Hashes. Ein gutes Beispiel ist " rsync "
Soweit ich weiß, dedropiert dropbox nur ganze Dateien, berechnet also einen Hash der gesamten Datei, um dieselbe Datei zu überprüfen
pst auf einigen Dateisystemen gibt es ein Datum geändert
Ratschenfreak
1
Würde Hashing nicht ein kleines, aber echtes Kollisionsrisiko verursachen, das dazu führt, dass eine Datei nicht synchronisiert wird? Dropbox verwendet anscheinend eine diff-ähnliche Implementierung. dropbox.com/help/8/en
mcandre
1
@mcandre das klingt wie es wäre besser als seine eigene Frage.
Großmeister
@ratchetfreak: Das Änderungsdatum ist auf einigen Systemen für diese Art von Problem nicht unbedingt zuverlässig. Eine einfache Berührung würde dazu führen, dass das Änderungsdatum anders ist, wenn möglicherweise keine Synchronisierung erforderlich ist.
Steven Evers
1
@ SnOrfus dann überprüfen Sie die Änderungen, wenn das Änderungsdatum geändert wird
Ratschenfreak
1
.NET verfügt beispielsweise über eine FileSystemWatcher-Klasse. Ich bin sicher, dass andere Low-Level-Sprachen und Laufzeiten ähnliche Funktionen bieten können.
Um Dateien zu vergleichen, müssen Sie letztendlich jedes Byte vergleichen - wie würden Sie sonst eine einzelne Byteänderung bemerken?
In der Realität lesen Sie Byteblöcke und berechnen einen Hashwert. Anschließend prüfen Sie anhand einer Liste von Hashes. Ein gutes Beispiel ist " rsync "
Soweit ich weiß, dedropiert dropbox nur ganze Dateien, berechnet also einen Hash der gesamten Datei, um dieselbe Datei zu überprüfen
quelle
.NET verfügt beispielsweise über eine FileSystemWatcher-Klasse. Ich bin sicher, dass andere Low-Level-Sprachen und Laufzeiten ähnliche Funktionen bieten können.
quelle