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


9

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

Ответы:


8

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

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


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. Я уверен, что другие языки низкого уровня и среды выполнения могут предоставить аналогичные возможности.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.