Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как выйти из рекурсивной функции? 
:(
    Опции темы
dtv2006
Дата 12.1.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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)
              
      

PM MAIL   Вверх
Daevaorn
Дата 12.1.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



dtv2006, как-то так:
Код

def deleteFolder( remote_path ):
    last = session.pwd()
    session.cwd( remote_path )
    
    files = session.nlst()
    dirs = session.dir()
    
    base = remote_path.rstrip( '/' ) + '/'
    for file in files:
        session.delete( base + file )

    for dir in dirs:
        deleteFolder( base + dir )
            
    session.cwd( last )
    session.rmd( remote_path )

PM MAIL WWW   Вверх
kulibinka
Дата 12.1.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Посмотрите модуль ftputil - http://ftputil.sschwarzer.net/trac/wiki/RussianDocumentation
Это высокоуровневый интерфейс для ftplib, там такая задача уже должна быть решена.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.