W jaki sposób większość programów do synchronizacji monitoruje zmiany plików?

9

Czy programy do synchronizacji, takie jak Dropbox, zwykle śledzą zmiany w plikach, porównując bajty po bajtach, używając skrótów lub używając diff/ zachowując lokalne dzienniki zatwierdzeń, takie jak kontrola wersji, czy co?

Mcandre
źródło

Odpowiedzi:

8

W systemie Windows istnieje mechanizm powiadamiania systemu operacyjnego o zmianie struktury „obserwowanego” katalogu - FindFirstChangeNotification (). Gdy to wskazuje, że plik się zmienił, aplikacja może następnie porównać pliki w zmienionym katalogu, aby znaleźć rzeczywiste pliki, które uległy zmianie, patrząc na rozmiar, datę modyfikacji, skrót itp.

To (jak Michael wskazuje poniżej) jest czymś, co każda platforma zapewni w jakiś sposób. Nie mówiłem, że tego rodzaju rzeczy są unikalne w systemie Windows.

Grandmaster B.
źródło
1
I jest inotify w Linuksie.
Michael
Ale co jeśli program synchronizacji nie działał w momencie zmiany pliku? Czy nie przegapi okazji, by zostać powiadomionym przez hak?
Mcandre
Użyłeś konkretnego przykładu dropboksa, który ogólnie działa w tle. Oczywiście, jeśli program nie działa, nie zostanie powiadomiony. Następnie musi użyć innych metod (być może zmodyfikowana data). Nie sądzę, żebyś uzyskał konkretną odpowiedź na temat tego, jakie SĄ określone metody, ponieważ różne programy działają inaczej. Lepiej zapytać twórców określonych programów.
GrandmasterB
@mcandre W zasadzie to, co powiedział GrandmasterB - jeśli przegapisz powiadomienie, będziesz musiał zeskanować folder. W zależności od tego, jak „dokładny” chcesz być, może to oznaczać po prostu szukanie nowych plików i modyfikowanie znaczników czasu / rozmiarów plików (są to stosunkowo niedrogie do wykonania) lub, w najgorszym przypadku, porównywanie całego pliku. Programy takie jak rsync zazwyczaj mieszają plik w porcjach, więc zmiany na wczesnym etapie można wykryć wcześniej, ale w najgorszym przypadku (pliki są identyczne) wszystko to przeczytasz.
Daniel B
2

Aby porównać pliki, musisz porównać każdy bajt - jak inaczej zauważyłbyś zmianę jednej bajtu?

W rzeczywistości odczytujesz bloki bajtów i obliczasz wartość skrótu, a następnie porównujesz listę skrótów. Dobrym przykładem jest „ rsync

O ile wiem, dropbox deduplikuje tylko całe pliki, więc obliczę skrót całego pliku, aby sprawdzić z tego samego pliku

Martin Beckett
źródło
1
pst w niektórych systemach plików zmodyfikowano datę
maniak ratchet
1
Czy mieszanie nie stworzyłoby małego, ale realnego ryzyka kolizji, powodując brak synchronizacji pliku? Dropbox najwyraźniej używa implementacji podobnej do diff. dropbox.com/help/8/en
mcandre
1
@mcandre, które brzmi tak, jakby lepiej byłoby, gdyby było to jego własne pytanie.
GrandmasterB
@ratchetfreak: data modyfikacji, w niektórych systemach, niekoniecznie jest niezawodna w przypadku tego rodzaju problemów. Prosty dotyk spowodowałby, że data modyfikacji byłaby inna, a synchronizacja może nie być wymagana.
Steven Evers
1
@SnOrfus następnie dokładnie sprawdź zmiany, gdy zmieni się data modyfikacji
maniak ratchet
1

Na przykład .NET ma klasę FileSystemWatcher. Jestem pewien, że inne języki niskiego poziomu i środowiska wykonawcze mogą zapewnić podobne możliwości.

Nik
źródło