Как я могу узнать, завершен ли файл по FTP? - PullRequest
4 голосов
/ 06 февраля 2009

У нас есть служба C # Windows, которая опрашивает папку, ожидающую публикации файла с FTP. Чтобы избежать использования файла, когда он все еще записывается, мы сначала пытаемся получить блокировку файла, однако Кажется, это случаи, когда мы получаем блокировку файла после того, как файл FTP создан, но до того, как файл будет записан, поэтому мы в конечном итоге открываем пустой файл.

Есть ли надежный способ узнать, завершен ли FTP?

Ответы [ 7 ]

8 голосов
/ 06 февраля 2009

Вы можете изменить имя файла перед загрузкой, а затем переименовать его после завершения. таким образом, он будет выглядеть так, будто его не существует до конца.

5 голосов
/ 06 февраля 2009

Практика, которую я видел, состояла в том, что вы передаете два файла: один - фактический файл, а второй - файл .done. В идеале, как только вы увидите файл .done, вы знаете, что первый файл должен быть готов.

Другие опции включают просмотр файла на наличие изменений и ожидание определенного количества времени без изменений. Конечно, это не полное доказательство.

Редактировать

Кайл отмечает, что добавление контрольной суммы в файл .done и / или указание размера первого файла является хорошей защитой от дополнительных случаев.

4 голосов
/ 06 февраля 2009

Я всегда большой поклонник протокола .filepart, так что независимо от того, какой протокол передачи вы используете (ftp, ssh, rsync и т. Д.), Вы понимаете одно и то же.

Это не прямой ответ на ваш вопрос, но вместо поиска решения только для ftp, более общее решение может быть лучше для вас в долгосрочной перспективе.

(. Filepart: переименуйте файл, test.txt в test.txt.filepart, затем, когда это будет сделано, назовите его обратно в test.txt)

3 голосов
/ 06 февраля 2009

Я всегда использовал файл контрольной суммы. Таким образом, вы отправляете файл контрольной суммы, который обозначает размер файла и контрольную сумму. Вы будете знать, что файл загружен правильно, когда контрольная сумма в первом файле совпадает с фактической контрольной суммой в файловой системе.

3 голосов
/ 06 февраля 2009

Как насчет использования средства просмотра папок для индексации содержимого, и если размер файла не изменяется в течение 5 минут, вы можете в значительной степени гарантировать, что загрузка была завершена.

Время ожидания может быть привязано к времени ожидания вашего FTP-сервера.

http://www.codeproject.com/KB/files/MonitorFolderActivity.aspx

1 голос
/ 06 февраля 2009

Метод, который я использовал в прошлом, представляет собой смесь некоторых других ответов здесь. то есть FTP файл, использующий расширение, отличное от ожидаемого (например, FILENAME.part), затем переименуйте его с соответствующим расширением в качестве последнего шага загрузки.

На сервере используйте FileSystemWatcher для поиска новых файлов с правильным расширением. FSW не увидит файл до тех пор, пока он не будет переименован, а операция переименования является атомарной, поэтому файл будет завершен и доступен в момент его переименования.

Переименование или перемещение файлов, конечно, зависит от того, как вы контролируете процесс загрузки.

Если у вас нет никакого контроля над тем, как файлы загружаются, вы будете зависеть от использования FSW, чтобы узнать, какой файл загружается, а затем контролировать его размер - когда он не меняется в течение длительного периода времени, вы можете быть в состоянии предположить это завершено.

0 голосов
/ 06 февраля 2009

Вместо опроса вы можете взглянуть на System.IO.FileSystemWatcher.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...