Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Синхронизация локальной директории с ftp


Автор: doctorltd 3.2.2009, 14:52
Добрый день! Подскажите, пожалуйста, как правильно организовать синхронизацию локальных файлов с фтп директорией. На фтп файлы не меняются и не добавляются, поэтому копирование должно идти только в сторону фтп.

Пока что у меня получилось только найти те локальные файлы, которых нет на сервере и закачать их туда. А вот узнать размер удаленного файла не получается. При попытке вызвать size скрипт останавливается с ошибкой 550 SIZE not allowed in ASCI mode.
И еще было бы здорово сравнивать не только по размеру, но и по дате изменения. А аналога mtime для ftp я не нашел. 

Собственно, как проверить какие файлы нужно обновить на фтп-сервере?

Автор: _Viper_ 3.2.2009, 17:02
Перед получением размера явно перейди в бинарный режим FTP.sendcmd('TYPE I'). Тогда size нормально работает.

P.S. Было бы неплохо если б ты приводил простой код который демонстрирует проблему.

Автор: doctorltd 3.2.2009, 17:53
Что-то не получилось не смотря на ваш совет =( Вот код
Код


# -*- coding: cp1251 -*-

from ftplib import FTP
import os.path
import os

    
print "CONNECTING TO FTP SERVER..."
ftp = FTP('server.in.ua')   
ftp.login("login", "pwd")
ftp.sendcmd('TYPE I')
ftp.cwd("pub/images")
content = ftp.nlst()

#в чистом списке останутся только jpg файлы
clear_list = []
for r_file in content:
    if ".jpg" in r_file:
        clear_list.append(r_file)
        print ftp.size(r_file) #ОШИБКА size not allowed in ASCII mode



Автор: _Viper_ 3.2.2009, 18:09
Попробуй:
Код

# -*- coding: cp1251 -*-

from ftplib import FTP
import os.path
import os

    
print "CONNECTING TO FTP SERVER..."
ftp = FTP('server.in.ua')   
ftp.login("login", "pwd")

ftp.cwd("pub/images")
content = ftp.nlst()

ftp.sendcmd('TYPE I')    #ставим непосредственно перед size

#в чистом списке останутся только jpg файлы
clear_list = []
for r_file in content:
    if ".jpg" in r_file:
        clear_list.append(r_file)
        print ftp.size(r_file) #ОШИБКА size not allowed in ASCII mode

Автор: doctorltd 4.2.2009, 09:34
Спасибо, получилось! А что на счёт второй части вопроса - как узнать время изменения удалённого файла?

Автор: _Viper_ 4.2.2009, 13:06
Могу предложить парсить результат команды nlst.

Автор: doctorltd 5.2.2009, 16:00
И как это сделать? У меня из вывода nlst получается вытянуть только имя файла!

Автор: doctorltd 5.2.2009, 17:23
Все, получилось через ftp.retrlines('LIST', content.append)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)