Запретить ftplib загружать файл в процессе выполнения?

StackOverflow https://stackoverflow.com/questions/375620

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Спасибо.

ОБНОВЛЕНИЕ 1:

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

Здесь у нас нет никаких реальных вариантов...хотим ли мы?

ОБНОВЛЕНИЕ 2:Что ж, вот кое-что интересное: некоторые из ftps, на которых мы тестировали, по-видимому, автоматически выделяют пространство после начала передачи.

Например.Если я передам файл размером 200 мб на ftp-сервер.Пока передача активна, если я подключаюсь к ftp-серверу и изменяю размер во время загрузки.Он показывает размер в 200 мб.Даже несмотря на то, что файл заполнен всего на 10%.

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

:'(

Это было полезно?

Решение

“Черт бы побрал эти торпеды!Полный вперед!”

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

Другие советы

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

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

Извините.

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

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

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

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

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


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

Сделай это.

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

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

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

    a.Достань файл.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top