In che modo la maggior parte dei programmi di sincronizzazione monitora le modifiche ai file?


9

Sincronizzare programmi come Dropbox in genere tiene traccia delle modifiche ai file eseguendo confronti byte per byte o utilizzando hash o utilizzando diff/ mantenendo registri di commit locali come il controllo della versione o cosa?

Risposte:


8

Su Windows esiste un meccanismo che consente al sistema operativo di avvisarti quando viene modificata una struttura di directory "controllata": FindFirstChangeNotification (). Quando ciò indica che un file è cambiato, un'applicazione può quindi confrontare i file nella directory modificata per trovare i file effettivi che sono cambiati osservando dimensione, data modificata, hash, ecc.

Questo (come sottolinea Michael sotto) è qualcosa che ogni piattaforma fornirebbe in qualche modo. Non stavo dicendo che questo genere di cose fosse unico per Windows.


1
E c'è inotify su Linux.
Michael,

E se il programma di sincronizzazione non fosse in esecuzione al momento della modifica del file? Non perderebbe l'occasione di essere avvisato dal gancio?
mcandre,

Hai usato l'esempio specifico di dropbox, che generalmente è in esecuzione in background. Ovviamente se il programma non è in esecuzione, non verrà notificato. Quindi deve usare altri metodi (data modificata, forse). Non credo che otterrai una risposta concreta su quali siano i metodi specifici utilizzati, perché programmi diversi fanno le cose in modo diverso. Meglio chiedere ai creatori dei programmi specifici in questione.
GrandmasterB,

@mcandre Più o meno quello che ha detto GrandmasterB - se hai perso la notifica, dovresti scansionare la cartella. A seconda di quanto "accurato" vuoi essere, ciò può significare semplicemente cercare nuovi file e timestamp / dimensioni dei file modificati (che sono relativamente poco costosi da fare) o, nel peggiore dei casi, confrontare l'intero file. Programmi come rsync in genere eseguono l'hashing del file in blocchi, quindi le modifiche precoci nei dati possono essere rilevate in precedenza, ma nel caso peggiore (i file sono identici), leggerai il tutto.
Daniel B,

2

In definitiva, per confrontare i file è necessario confrontare ogni byte - in quale altro modo noteresti una modifica a singolo byte?

In realtà leggi blocchi di byte e calcoli un valore di hash, poi controlli un elenco di hash. Un buon esempio è " rsync "

Per quanto ne so dropbox deduce solo interi file, quindi calcolerà un hash dell'intero file per controllare lo stesso file


1
pst su alcuni file system c'è una data modificata
maniaco del cricchetto

1
L'hashing non creerebbe un rischio piccolo ma reale di collisioni, con conseguente non sincronizzazione di un file? Dropbox apparentemente usa un'implementazione di tipo diff. dropbox.com/help/8/it
mcandre

1
@mcandre sembra che sarebbe meglio come una sua domanda.
GrandmasterB,

@ratchetfreak: la data di modifica, su alcuni sistemi, non è necessariamente affidabile per questo tipo di problema. Un semplice tocco farebbe sì che la data modificata fosse diversa, in cui una sincronizzazione potrebbe non essere effettivamente richiesta.
Steven Evers,

1
@SnOrfus quindi ricontrolla le modifiche quando viene modificata la data modificata
maniaco del cricchetto

1

.NET ad esempio ha una classe FileSystemWatcher. Sono sicuro che altre lingue e runtime di basso livello possono fornire capacità simili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.