2017-02-09 5 views
0

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

Моя проблема заключается в том, что службы FTP, в общем, позволяют загружать файл, пока файл еще не загружен. This - одна из ссылок на проблему, которую можно найти в Интернете.

Это может привести к незаполненному загрузке файла.

Я пытаюсь воспроизвести ситуацию, используя сервер Windows и FTP-клиент FileZilla, и получил половину файла, как ожидалось, поэтому для предотвращения этого не было безопасного механизма. Так что, может быть, просто нет способа предотвратить это со стороны клиента.

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

Мне было трудно поверить, что протокол устарел, поскольку ftp не обеспечивает безопасный механизм, поэтому я должен что-то пропускать, или это по дизайну.

Обновление Я разрабатываю автоматизацию на C#, но любой технический совет может помочь. Решение нужно петь дураком, потому что это важно для бизнеса.

update2 Загрузка осуществляется разными клиентами, поэтому невозможно установить соглашение со всеми.

Update3 Этот вопрос похож на вопрос How to detect that a file is being uploaded over FTP, но имеет дополнительное ограничение, представленный на Update2.

+2

Какой механизм вы ожидаете от ftp здесь? Это открытие файла на диске и чтение из него, если файловая система не мешает ему это делать, как сервер ftp знает, что файл действительно занят? И нет, вы не можете исправить эту клиентскую сторону, это нужно сделать на стороне сервера. Короче говоря, настройте серверное программное обеспечение таким образом, чтобы загружаемые файлы не совпадали с загружаемыми вами файлами. –

+1

Я думаю, что это не связано с программированием, см. [Этот ответ] (http://stackoverflow.com/a/29249203/579895) – Pikoh

+0

@ LasseV.Karlsen, как служба, служба FTP контролирует 2. Кроме того, следует знать, когда файл завершен. – ByteArtisan

ответ

1

Я создал следующее автоматизированное решение, основанное на материалах ответов на этом сообщении и других, для решения моей проблемы, как есть, что означает: вытягивать файлы с разных FTP-серверов из разных брендов в сценарий, где параллелизм очень нравится.

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

Итак, мое решение было:

  1. просканировать папку разбора имен файлов, данных и размер каждого файла.
  2. отбросьте любой новый файл. Только если дата файла старше, чем несколько минут, считается загруженной. Повреждения могут привести к сбою этого правила, предотвращая параллелизм.
  3. Переименуйте файл. Это не получается, выпрыгните. Этот метод, основанный на параллелизме, оказался на данный момент на 100% точным.
  4. загрузить переименованный файл.
  5. проверить размер перевода и посмотреть, соответствует ли атрибут размера (проверка паранойи)
  6. удалите удаленный переданный файл с ftp-сервера.

Это решение позволяет интенсивно обследовать папки ftp.

0

Я считаю, что с клиентской стороны вы не можете многое сделать.

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

+0

Я хотя и переименовал файл, а затем переименовал обратно, но может вызвать другие проблемы. – ByteArtisan

+0

@ByteArtisan Единственный надежный способ - Если бы вы могли контролировать процесс загрузки.Таким образом, вы можете начать загрузку с временного имени или расширения (например, myfile.txt.temp), и только после того, как загрузка будет успешной, вы переименуете ее в соответствующее имя файла (myfile.txt). Затем читатель мог бы игнорировать такие файлы, как * .temp. Однако это означает наличие соглашения между загрузчиками и загрузчиками, что, я понимаю, у вас нет возможности обеспечить соблюдение. –

+0

, к сожалению, это не так. – ByteArtisan

0

FTP не был разработан как протокол для обмена данными в реальном времени между двумя клиентами с использованием FTP-сервера. Клиенту не сообщается о каком-либо уведомлении, если файл, предназначенный для загрузки, все еще загружен и не является их указанием при перезаписывании файла, который кто-то в настоящее время загружает этот файл. Это не ошибка проектирования в протоколе FTP. Реальная проблема заключается в том, что вы пытаетесь использовать протокол с той целью, для которой он не был предназначен.

+0

Простой случай: Entity A помещает файлы на ftp-сервер, объект B получает файлы. Между сущностями А и В. Время не предоставляется. Файлы большие, и для загрузки требуется 1 час. Как B должен обрабатывать загрузку? – ByteArtisan

+0

@ByteArtisan: опять же FTP не был предназначен для этого случая использования. Таким образом, не жалуйтесь, что он не обеспечивает то, что вы хотите, но используете протокол, который обеспечивает то, что вам нужно. Вам понадобится протокол, который поддерживает блокировку данных, например WebDAV, или вам нужно будет добавить собственную хрупкую логику блокировки поверх FTP, используя вспомогательные файлы. –

+0

Знаю, что я думаю, что ты прав. Я не думаю, что мой случай использования, или простой, являются необычными, поэтому я неохотно об этом. Во всяком случае, я могу заставить клиентов перейти на другие протоколы, поэтому придется идти на трюк. – ByteArtisan

0

Так у вас есть такой сценарий:

[Publisher] --uploads file--> [FTP Server] --downloads file--> [You] 

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

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

Есть три основных решения для этого:

  • Дозорные файлы, написанные на FTP-сервер или плагин. Либо «$ originalFileName.lock», который существует во время загрузки файла, либо «$ originalFileName.done», который записывается, когда загрузка успешно завершена.
  • Перемещение файлов в разные каталоги: FTP-сервер перемещает файлы из каталога загрузки, где издатель записывает в каталог загрузки, из которого вы читаете.
  • Наименее стабильный: проверьте размер и время файла. Когда вы начинаете загрузку, помните временную метку и размер файла, который сообщает сервер FTP. Когда вы закончите загрузку файла, сравните свои значения с запоминающимися. Когда они не совпадают, возобновите загрузку с того места, где вы закончили, чтобы получить оставшиеся байты, объявление inifitum. Вы можете, например, определить «Файл успешно загружен, если он не вырос в размере в течение пяти минут», но это не очень удобно - и это может привести к тому, что вы подождите пять минут.
+0

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

Смежные вопросы