Как большинство программ синхронизации отслеживают изменения файлов?

9

Отслеживают ли программы синхронизации, такие как Dropbox, как правило, изменения файла, выполняя побайтовые сравнения, или используя хэши, или используя diff/ сохраняя локальные журналы фиксации, такие как контроль версий, или что?

mcandre
источник

Ответы:

8

В Windows есть механизм, позволяющий ОС предупреждать вас, когда происходит изменение в структуре отслеживаемых каталогов - FindFirstChangeNotification (). Когда это означает, что файл был изменен, приложение может затем сравнить файлы в измененном каталоге, чтобы найти фактические файлы, которые изменились, просмотрев размер, дату изменения, хэш и т. Д.

Это (как указывает Майкл ниже) - это то, что каждая платформа предоставит определенным образом. Я не говорил, что такого рода вещи уникальны для Windows.

GrandmasterB
источник
1
И в Linux есть inotify .
Майкл
Но что, если программа синхронизации не была запущена во время изменения файла? Не упустит ли это возможность получить уведомление от крючка?
МакКандр
Вы использовали конкретный пример Dropbox, который обычно работает в фоновом режиме. Очевидно, что если программа не запущена, она не получит уведомление. Затем он должен использовать другие методы (возможно, измененную дату). Я не думаю, что вы получите конкретный ответ о том, какие конкретные методы используются, потому что разные программы делают вещи по-разному. Лучше спросить создателей конкретных программ, о которых идет речь.
GrandmasterB
@mcandre Почти то, что сказал GrandmasterB - если вы пропустили уведомление, вам придется сканировать папку. В зависимости от того, насколько «точным» вы хотите быть, это может означать просто поиск новых файлов и измененных временных меток / размеров файлов (это относительно недорого), или, в худшем случае, сравнение всего файла. Такие программы, как rsync, обычно хэшируют файл по частям, поэтому изменения в данных на ранних этапах можно обнаружить раньше, но в худшем случае (файлы идентичны) вы можете прочитать все целиком.
Даниэль Б,
2

В конечном итоге для сравнения файлов вам нужно сравнивать каждый байт - как еще вы заметите изменение одного байта?

В действительности вы читаете блоки байтов и вычисляете значение хеша, а затем проверяете список хешей. Хороший пример " rsync "

Насколько я знаю, dropbox только дедуплицирует целые файлы, поэтому вычислит хэш всего файла, чтобы проверить тот же файл.

Мартин Беккет
источник
1
В некоторых файловых системах pst изменена дата
ratchet freak
1
Разве хеширование не создает небольшой, но реальный риск коллизий, в результате чего файл не синхронизируется? Dropbox, очевидно, использует реализацию, похожую на diff. dropbox.com/help/8/en
mcandre
1
@mcandre это звучит так, как будто это был бы вопрос.
GrandmasterB
@ratchetfreak: дата изменения в некоторых системах не всегда надежна для такого рода проблем. Простое прикосновение приведет к тому, что измененная дата будет другой, тогда как синхронизация может и не потребоваться.
Стивен Эверс
1
@SnOrfus затем дважды проверьте изменения, когда изменилась измененная дата
трещотка урод
1

Например, в .NET есть класс FileSystemWatcher. Я уверен, что другие языки низкого уровня и среды выполнения могут предоставить аналогичные возможности.

Nik
источник