2009-10-08 3 views
5

Sto scrivendo un semplice programma che viene utilizzato per sincronizzare i file su un FTP. Voglio essere in grado di verificare se la versione locale di un file è diversa dalla versione remota, quindi posso sapere se è necessario trasferire i file. Potrei controllare la dimensione del file, ma non è affidabile al 100% perché ovviamente è possibile che due file abbiano le stesse dimensioni ma contengano dati diversi. La data/ora in cui i file sono stati modificati non è affidabile in quanto la data del computer dell'utente potrebbe essere impostata errata.Come posso sapere se un file su un FTP è identico a un file locale senza il download effettivo del file?

C'è qualche altro modo per sapere se un file locale e un file su un FTP sono identici?

risposta

5

Non esiste un modo generico. Se il sito ftp include un file di checksum, è possibile scaricarlo (che sarà molto più veloce dal momento che il checksum è piuttosto piccolo) e quindi verificare se i checksum corrispondono. Ma naturalmente, questo si basa sul proprietario del sito ftp che crea un file di checksum e lo mantiene aggiornato.

Altro che quello, sei S.O.L.

1

Utilizzare un checksum. Si genera l'hash md5 (o sha1, sha2 etc) di entrambi i file e se i file sono identici, gli hash saranno identici.

+3

Come funziona senza download? –

+0

Bene, funziona se si ha il controllo del ftp, e si possono generare checksum ogni volta che un file viene caricato ... che tecnicamente è ancora un download, suppongo, ma non è un download di un file di dimensioni arbitrarie. – neminem

2

Se il server è FTP vecchio, non è possibile fare di meglio che controllare la dimensione e la data e l'ora.

FTP non ha alcun meccanismo per fornire hash/checksum dei file, quindi è necessario fare qualcosa come mantenere un "file di elenco" speciale che abbia tutti i nomi di file e gli hash, o fare una richiesta separata via HTTP, o qualche altro protocollo.

Idealmente, non dovresti comunque usare FTP, è davvero un protocollo obsoleto. Se hai il controllo del sistema, potresti usare rsync o qualcosa di simile.

1

IETF ha cercato di ottenere questo risultato aggiungendo nuovi comandi FTP come MD5 e MMD5.

http://www.faqs.org/rfcs/ftp-rfcs.html

Tuttavia, non tutti i fornitori FTP li supportano. Quindi è necessario avere un controllo sul server FTP di destinazione su cui si applicherà l'applicazione per vedere se supporta MD5/MMD5. In caso contrario, è possibile raccogliere i workaround di cui sopra.

0

Ogni volta che i carica i file client al server FTP, mappa ogni file al suo hash e memorizzare localmente sul computer client (o memorizzare ovunque è possibile accedere in seguito, la materia formato doesnt, può essere un file XML, testo normale, purché sia ​​possibile recuperare le coppie chiave/valore). Quindi quando carichi nuovamente i file, controlla i file locali con la tabella hash che hai creato, se è diverso, carica il file. In questo modo non è necessario fare affidamento sul server per mantenere un file di checksum e non è necessario eseguire un processo per monitorare gli eventi FileSystemWatcher.