sakkko/Karmanet — Issue #23: Calcolo delle differenza tra il file share e la directory dei file condivisi
Author: sakkko
Created: 2011-10-16 15:23:33+00:00
State: open
Labels: client, karmanet

Ho modificato l'invio della lista dei file al superpeer. Il file share viene creato inserendo in ordine alfabetico ogni cartella e tutti i file in essa contenuti. Una cosa del tipo:
cartellaA
file1
file2
cartellaB
file3
file4
ecc.

Il file share contiene righe per le directory e righe per i file.
Le righe per le directory hanno questa struttura:
#\n
Le righe per i file hanno questa struttura:
%\n

Il fleg iniziale serve per distinguere tra cartelle e file, # è per le cartelle, % per i file
MODTIME è il tempo di ultima modifica del file o directory. Nel caso di directory serve per evitare di controllare la directory se il MODTIME non è cambiato, per i file serve per ricalcolare l'md5 nel caso il MODTIME sia cambiato.

I confronti vengono fatti tra questo file e l'albero delle directory ottenuto a runtime dal programma, che viene visitato ricorsivamente. Si considera l'ordinamento lessicografico.
L'algoritmo è semplice: se il nome della directory letto dal file è uguale a quello della directory attualmente considerata dal programma, allora si controlla il MODTIME. Se il MODTIME non è cambiato, si copiano tutte le entry su un file di appoggio (che poi diventarà il nuovo file share) fino ad incontrare nel file la cartella successiva o la fine del file. Se il MODTIME è diverso si passa ad analizzare i file. Il programma ottiene tutti i file attualmente presenti nella directory in questione e li confronta con quelli scritti nel file. Se il nome è uguale, allora controlla il MODTIME e se anche questo è uguale copia la entry relativa al fine nel file di appoggio. Se il MODTIME è diverso, calcola il nuovo MD5 del file e inserisce la nuova entry relativa al file (con il nuovo MODTIME e il nuovo MD5) nel file di appoggio.
Se il nome del file letto è minore di quello attualmente considerato, allora tale file letto non è presente nella directory e quindi non viene scritto nel file di appoggio e viene aggiunto al file diff.
Viceversa se il nome del file letto è maggiore di quello attualmente considerato, significa che il file attualmente considerato non era presente precedentemente nella directory ed è stato aggiunto. Quindi lo scrive nel file share e lo aggiunge al file diff.
Un ragionamento analogo vale per le directory e in tal caso l'operazione (aggiunta o rimozione) viene applicata ad ogni file della directory.

Il file diff contiene le differenze tra cartella dei file sharede l'ultimo fale share creato, ed è quello che verrà letto dal peer/superpeer per inviare/aggiornare la lista dei file condivisi.

La struttura del file è
\n
I FLAG sono '+' e '-' e indicano rispettivamente se il file deve essere aggiunto o rimosso dalla lista.