Как я могу определить, идентичен ли файл на FTP локальному файлу без его фактической загрузки? - PullRequest
5 голосов
/ 09 октября 2009

Я пишу простую программу, которая используется для синхронизации файлов на FTP. Я хочу иметь возможность проверить, отличается ли локальная версия файла от удаленной версии, поэтому я могу сказать, нужно ли передавать файл (ы). Я мог бы проверить размер файла, но это не на 100% надежно, поскольку очевидно, что два файла могут быть одинакового размера, но содержать разные данные. Дата / время, когда файлы были изменены, также ненадежны, так как дата компьютера пользователя может быть установлена ​​неправильно.

Есть ли другой способ определить, идентичны ли локальный файл и файл на FTP?

Ответы [ 6 ]

5 голосов
/ 09 октября 2009

Универсального пути не существует. Если на сайте ftp есть файл контрольной суммы, вы можете загрузить его (что будет намного быстрее, поскольку контрольная сумма довольно мала), а затем посмотреть, совпадают ли контрольные суммы. Но, конечно, это зависит от владельца сайта ftp, который создает файл контрольной суммы и поддерживает его в актуальном состоянии.

Кроме того, вы S.O.L.

2 голосов
/ 09 октября 2009

Если на сервере установлен обычный старый FTP, вы ничего не можете сделать лучше, чем проверка размера и временных меток.

FTP не имеет механизма для предоставления вам хэшей / контрольных сумм файлов, поэтому вам нужно будет сделать что-то вроде сохранения специального «файла списка», который содержит все имена файлов и хэши, или выполнения отдельного запроса через HTTP, или какой-то другой протокол.

В идеале, вы все равно не должны использовать FTP, это действительно устаревший протокол. Если у вас есть контроль над системой, вы можете использовать rsync или что-то подобное.

1 голос
/ 15 октября 2009

IETF попытался добиться этого, добавив новые команды FTP, такие как MD5 и MMD5.

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

Однако не все поставщики FTP поддерживают их. Таким образом, вы должны проверить целевой сервер FTP, с которым вы будете работать, чтобы узнать, поддерживает ли он MD5 / MMD5. Если нет, вы можете подобрать обходные пути, упомянутые выше.

1 голос
/ 09 октября 2009

Используйте контрольную сумму. Вы генерируете хэш md5 (или sha1, sha2 и т. Д.) Для обоих файлов, и если файлы идентичны, хэши будут идентичны.

0 голосов
/ 05 июня 2012

Всякий раз, когда ваш клиент загружает файлы на FTP-сервер, сопоставьте каждый файл с его хэшем и сохраните его локально на клиентском компьютере (или сохраните его в любом месте, к которому вы сможете обратиться позже, формат не имеет значения, это может быть файл XML, простой текст, до тех пор, пока вы можете получить пары ключ / значение). Затем, когда вы загружаете файлы снова, просто проверьте локальные файлы с созданной вами хэш-таблицей, если она отличается, загрузите файл. Таким образом, вам не нужно полагаться на сервер для ведения файла контрольной суммы, и вам не нужно запускать процесс для отслеживания событий FileSystemWatcher.

0 голосов
/ 25 сентября 2010

Не могли бы вы использовать FileSystemWatcher и просто попросить клиента запомнить, что изменилось? http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

...