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

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

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

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

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

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

Спасибо.

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

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

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

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

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

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

: '(

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
1 512
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

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


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

Сделай это.

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

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

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

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

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

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

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

Простите.

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

Ответ принят как подходящий

«К черту торпеды! Полный вперед! »

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

Это совсем не плохой способ. Мне это нравится.

UberJumper 17.12.2008 22:55

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