У нас есть настройка системы ftp для мониторинга / загрузки с удаленных серверов ftp, которые не находятся под нашим контролем. Сценарий подключается к удаленному ftp и получает имена файлов на сервере, затем мы проверяем, было ли это что-то уже загруженное. Если он не был загружен, мы загружаем файл и добавляем его в список.
Недавно мы столкнулись с проблемой, когда кто-то на удаленной стороне ftp скопирует один массивный файл (> 1 ГБ), после чего скрипт проснется, увидит новый файл и начнет загрузку файла, в который копируется.
Как лучше всего это проверить? Я думал о том, чтобы получить размер файла, подождав несколько секунд, снова проверив размер файла и посмотрю, увеличился ли он, если нет, то мы его загружаем. Но поскольку время имеет значение, мы не можем ждать несколько секунд для каждого отдельного набора файлов и посмотреть, увеличился ли его размер.
Что было бы наилучшим способом сделать это, в настоящее время все делается через pythons ftplib, как мы можем это сделать, помимо использования вышеупомянутого метода.
Еще раз позвольте мне повторить это, у нас нет контроля над удаленными сайтами ftp.
Спасибо.
ОБНОВЛЕНИЕ1:
Я подумал, что, если я попытаюсь переименовать его ... поскольку у нас есть полные разрешения на ftp, если загрузка файла выполняется, команда переименования завершится ошибкой?
У нас здесь нет реальных вариантов ... не так ли?
ОБНОВЛЕНИЕ2: Что ж, вот кое-что интересное: некоторые из ftps, на которых мы тестировали, похоже, автоматически выделяют пространство после начала передачи.
Например. Если я передаю файл размером 200 МБ на ftp-сервер. Пока передача активна, если я подключаюсь к ftp-серверу и устанавливаю размер во время загрузки. Он показывает размер 200мб. Несмотря на то, что файл заполнен всего на 10%.
Разрешения также кажутся случайными. FTP-сервер, поставляемый с IIS, устанавливает разрешения ПОСЛЕ завершения копирования файла. В то время как некоторые другие старые ftp-серверы устанавливают его, как только вы отправляете файл.
: '(






Вы не можете знать, когда будет выполнено копирование ОС. Он мог замедлиться или подождать.
Для абсолютной уверенности вам действительно нужны два файла.
Они могут возиться с массивным файлом, сколько захотят. Но когда они касаются триггерного файла, вы загружаете оба.
Если вы не можете получить триггер, вам нужно сбалансировать время, необходимое для опроса, и время, необходимое для загрузки.
Сделай это.
Получите список. Проверьте отметки времени.
Проверьте размеры по сравнению с предыдущим размером файла. Если размер даже не близок, его прямо сейчас копируют. Ждать; Сделайте петлю на этом шаге, пока размер не приблизится к предыдущему размеру.
Пока вы еще не закончили:
а. Получите файл.
б. Получите объявление СНОВА. Проверьте размер нового объявления, предыдущего объявления и вашего файла. Если они согласны: готово. Если они не согласны: файл был изменен во время загрузки; ты еще не закончил.
Поскольку вы говорите, что у вас нет контроля над серверами и вы не можете заставить своих клиентов публиковать файлы триггеров, как предлагает С. Лотт, вы должны иметь дело с несовершенным решением и рисковать неполной передачей файла, возможно, подождав некоторое время и сравните размеры файлов. до и после.
Вы можете попробовать переименовать, как вы предложили, но, поскольку у вас есть 0 элементов управления, вы не можете быть уверены, что ftp-server-administrator (или его преемник) не изменит платформы или ftp-серверы и не ограничит ваши разрешения.
Простите.
Если вы имеете дело с несколькими файлами, вы можете получить список всех размеров сразу, подождать десять секунд и посмотреть, какие из них совпадают. Какие бы файлы остались прежними, их можно безопасно скачать.
«К черту торпеды! Полный вперед! »
Просто скачайте файл. Если это большой файл, то после завершения загрузки подождите, пока это разумно для вашего сценария, и продолжайте загрузку с того места, где она была остановлена. Повторяйте, пока не останется ничего для загрузки.
Это совсем не плохой способ. Мне это нравится.