![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
dtv2006 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 12.1.2007 Репутация: 1 Всего: 1 |
Коллеги, привет,
у меня стоит задача написать небольшой скрипт по аплоада/даунлоада папок/файлов с/на ftp. Решил использовать Python, но в нем абсолютный новичек. В большой задаче есть частная подзадача - удалить ftp папку. Как вы понимаете вложенность папок может быть неограниченной, т.е. стандартоной командой ftplib rmd непустую папку не удалишь(при работе с win, это сделать можно с помощью - shutil.rmtree). Поэтому решил написать рекурсивную процедуру, которая впринципе работает нормально, но вот к сожалению после удаления нужного фолдера не может "нормально" остановиться...и все время вылетают ошибки доступа при попытке обращения к уже удаленным папкам Использовать функцию break нельзя - можно только в циклах return - судя по всему возвращает на предыдущий вызов функции и потом вызывает ошибку т.к подпапок которые эта функция удаляет уже уже нет.. Единственный вариант это вызов эксепшена, но как мне кажется это не самый правильный и красивый варант.... Подскажите, может есть какая-то более правильная команда/подход....? Спасибо Вот процедура: def deletefolder(ftproot,foldertodelete,recurfolder,lastemptyfolder,iscwd): listoffolders=[] fileslist=[] subfolderslist=[] vtemproot="" topfolder="" vtemproot=recurfolder if (iscwd==0): session.cwd(vtemproot) session.retrlines("LIST ",listoffolders.append) for folderitem in listoffolders: tempfolderitem=[] tempfolderitem =folderitem.rsplit() if (tempfolderitem[2]=="<DIR>"): subfolderslist.append(tempfolderitem[3]) else: fileslist.append(tempfolderitem[3]) if (len(subfolderslist)!=0): for subfolder in subfolderslist: deletefolder(ftproot,foldertodelete,subfolder,"",0) else: print "stage 3" if (len(fileslist)!=0): for file in fileslist: print "deleted-"+file session.delete(file) lastemptyfolder=vtemproot topfolder=session.pwd() topfolder=topfolder[0:len(topfolder)-len(lastemptyfolder)-1] session.cwd(topfolder) if ((str(topfolder)==str(ftproot)) and (str(lastemptyfolder)==str(foldertodelete))): session.rmd(lastemptyfolder) # варианты которые я пробовал return "deleted" raise "deleted" else: session.rmd(lastemptyfolder) session.cwd(topfolder) sbstr=getlastpartofstring(topfolder,"/") deletefolder(ftproot,foldertodelete,sbstr,"",1) |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 9 Всего: 70 |
dtv2006, как-то так:
|
|||
|
||||
kulibinka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 20.11.2006 Репутация: 2 Всего: 4 |
Посмотрите модуль ftputil - http://ftputil.sschwarzer.net/trac/wiki/RussianDocumentation
Это высокоуровневый интерфейс для ftplib, там такая задача уже должна быть решена. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |