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


Автор: OzMod 20.3.2019, 21:57
ftplib - как удалить директорию с папками и файлами,
а не просто файл или пустую папку...

Зарание спасибо !

Автор: Romikgy 21.3.2019, 09:28
FTP.rmd(dirname)¶
Remove the directory named dirname on the server.

возможно понадобиться рекурсивное удаление всех файлов внутри директории 
FTP.delete(filename)¶

Автор: OzMod 27.3.2019, 09:58
Romikgy

А примерчик небольшой можно ?
Скажем мне нужно удалить эту директорию (Папка 1), а в ней лежит следующее...

Папка 1 - (надо её удалить)
    |---- файл 1 - (а в ней файл 1)
    |---- папка 2 - (там же папка 2)
            |---- файл 2 - (а в папке 2 , файл-2)


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

Автор: baldman88 29.3.2019, 02:13
Цитата
я конечно могу скажем зайти в каждую папку по удалить оттуда файлы, а потом следом и папки...

Да. Как заметили выше, и как Вы сами догадались, удалять нужно рекурсивно. Во примерный код:
Код
#import ftplib
#import os

ftp = ftplib.FTP('ftp.youserver.name')

def rmtree(ftp, path):
    names = ftp.nlst(path)
    for name in names:
        if os.path.split(name)[1] in ('.', '..'):
            continue
        ftp.cwd(name)
        if ftp.pwd() != path:
            ftp.cwd(path)
            rmtree(ftp, name)
        else:
            ftp.delete(name)
    ftp.rmd(path)

Код не проверял, и на Python вообще давно не писал, так что пример, скорее всего, не будет работать. Но суть должна быть ясна. По хорошему вместо if ... else, нужно использовать try ... catch smile

Автор: OzMod 30.3.2019, 15:51
baldman88
Доброго времени суток...
Как вы и сказали ваш пример не работает...
---------------------------------------------------------------
Может у вас есть еще какие мысли как это можно сделать...
Может НА python есть еще какие нибудь библиотеки для работы с FTP?..
--------------------------------------------------------------------------------------
Можно конкретный пример, скажем...
ftp = ftplib.FTP(192.168.0.77)  # скажем по локальному IP
ftp.login(user , passwd)
ftp.cwd("OzFILES") #путь - В этой директории, есть папка скажем (TEMP, в ней папка garbage в которой файл remove.txt)
-----------------------------------------------------
TEMP - (надо её удалить)
    |---- garbage  - (там папка garbage)
            |---- remove.txt - (а в ней, файл - remove.txt)


Автор: baldman88 7.4.2019, 12:44
Да, пример не рабочий от слова совсем  smile 

У меня нет на чем проверить с удалением, но вот такой пример работает:

Код
import ftplib

ftp = ftplib.FTP('85.143.112.112')
ftp.login('anonymous', '')

def check_items(ftp, path):
    current_path = ftp.pwd()
    names = ftp.nlst(path)
    for name in names:
        try:
            ftp.cwd(name)
            print(name + ' is a directory')
            ftp.cwd(current_path)
            check_items(ftp, name)
        except ftplib.error_perm:
            print(name + ' is a file')

check_items(ftp, 'debian/doc')


По идее, следующее тоже должно работать:

Код
import ftplib

ftp = ftplib.FTP('192.168.0.77')
ftp.login('user', 'passwd')

def rmtree(ftp, path):
    # обязательно сохраняем путь к рабочей директории, из которой запускаетя функция, так как работать будем с относительными путями
    current_path = ftp.pwd()
    names = ftp.nlst(path)
    for name in names:
        # пробуем зайти, если это директория, то все хорошо, иначе получим исключение
        try:
            ftp.cwd(name)
            # если получилось зайти, то это директория -- идем в рабочую директорию
            ftp.cwd(current_path)
            # запускаем функцию еще раз для этого пути
            rmtree(ftp, name)
        # если получили исключение, значит это не директория -- удаляем
        except ftplib.error_perm:
            ftp.delete(name)
        # здесь еще можно, на всякий случай, ловить все остальные исключения, например:
        #except ftplib.all_errors:
        #    print('Some error ...')
        #    return

    # на всякий случай, удалять пустую директорию будем в секции try, а то мало ли
    try:
        # удаляем пустую директорию
        ftp.rmd(path)
    except ftplib.all_errors:
        pass

# обязательно нужно вызывать из родительской для OzFILES директории
rmtree(ftp, 'OzFILES/TEMP')


Как-то так.

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