Предотвратить загрузку файла ftplib? - PullRequest
4 голосов
/ 17 декабря 2008

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

Недавно мы столкнулись с проблемой, когда кто-то на удаленной стороне ftp скопирует один массивный файл (> 1 ГБ), затем сценарий проснется, увидит новый файл и начнет загружать файл, который копируется.

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

Каков наилучший способ сделать это, в настоящее время все делается с помощью pytons ftplib, как мы можем сделать это, кроме использования вышеупомянутого метода.

Еще раз позвольте мне повторить это, мы имеем 0 контроля над удаленными FTP-сайтами.

Спасибо.

Update1:

Я думал, что если я попытаюсь переименовать его ... поскольку у нас есть полные права на ftp, если загрузка файла выполняется, команда переименования завершится неудачно?

У нас здесь нет реальных вариантов ... не так ли?

UPDATE2: Что ж, вот кое-что интересное: некоторые из ftps, на которых мы тестировали, автоматически распределяют пространство после начала передачи.

например. Если я перенесу файл 200 МБ на сервер FTP. Пока передача активна, если я подключаюсь к серверу ftp и делаю размер, пока происходит загрузка. Это показывает 200 МБ для размера. Даже если файл готов только на 10%.

Полномочия также, по-видимому, устанавливаются случайным образом. Сервер FTP, поставляемый с IIS, устанавливает права ПОСЛЕ завершения копирования файла. В то время как некоторые другие старые FTP-серверы устанавливают его, как только вы отправляете файл.

: '(

Ответы [ 4 ]

5 голосов
/ 17 декабря 2008

«Будь прокляты торпеды! На полной скорости вперед! »

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

0 голосов
/ 17 декабря 2008

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

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

Извините.

0 голосов
/ 17 декабря 2008

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

0 голосов
/ 17 декабря 2008

Вы не можете знать, когда будет выполнена копия ОС. Это может замедлиться или подождать.

Для полной уверенности вам действительно нужны два файла.

  • Массивный файл.
  • И крошечный файл триггера.

Они могут связываться с массивными файлами, сколько захотят. Но когда они касаются файла триггера, вы скачиваете оба.


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

Сделай это.

  1. Получить список. Проверьте метки времени.

  2. Проверка размеров по сравнению с предыдущим размером файла. Если размер даже не близок, он копируется прямо сейчас. Подождите; цикл на этом шаге, пока размер не приблизится к предыдущему размеру.

  3. Пока вы не закончили:

    а. Получить файл.

    б. Получить объявление снова. Проверьте размер нового списка, предыдущего списка и вашего файла. Если они согласны: все готово. Если они не согласны: файл изменился во время загрузки; ты не закончил.

...