Получить размер папки с помощью FtpLib

Я использую FtpLib (Python) для загрузки папки с файлами с ftp-сервера. Но я хочу узнать размер папки, прежде чем я начну ее скачивать.

В документации я нашел FTP.size(filename), но это только для файлов, а не для папок ... Я мог бы просмотреть все файлы в папке, но возможно, что папка содержит подпапки.

Так кто-нибудь знает, как получить размер папки с помощью FtpLib?


person Frederik Voordeckers    schedule 28.02.2014    source источник
comment
Я не знаю, есть ли готовый к использованию python lib / module, но структура ftp этого не позволяет. Кажется, что вы должны суммировать размеры файлов в папке в вашем коде, и вы должны делать это рекурсивно, чтобы получить размер папки.   -  person obayhan    schedule 28.02.2014


Ответы (3)


После некоторых проб и ошибок я нашел решение.

Он основан на решении Alex Thorntons, но я учел, что могут быть вложенные папки. Если это папка, команда ftp.cwd() завершается успешно, и функция вызывается рекурсивно.

Когда команда ftp.cwd() выдает ошибку, это был файл, и мы можем получить размер файла. Тип установлен на «I» (изображения), это приводит к принудительному использованию двоичного режима, поскольку команда ftp.size() не разрешена в режиме ASCII.

def get_total_size(self, directory):
    size = 0
    for filename in self.ftp.nlst(directory):
        try:
            self.ftp.cwd(filename)
            size += self.get_total_size(filename)
        except:
            self.ftp.voidcmd('TYPE I')
            size += self.ftp.size(filename)
    return size
person Frederik Voordeckers    schedule 28.02.2014
comment
Я думаю, что в этом скрипте self не нужен! - person multigoodverse; 22.03.2015

Решение Фредерика Вордекерса не сработало для меня. Когда метод вызывается рекурсивно, при работе со структурой подпапок возникает ошибка 550 directory/.../sub_directory: No such file or directory.
Я изменил его исходный код, удалив «самообъявления», поскольку я не использовал метод внутри класса . Это могло вызвать ошибку. Я не знаю.

Вот мое решение:

def get_total_size(ftp_dir):
    size = 0
    parent_dir = ftp.pwd() # get the current directory
    for filename in ftp.nlst(ftp_dir):
        # (don't forget to import os)
        path = os.path.join(parent_dir, filename) # keeps recursively track of the path
        try:
            ftp.cwd(path)
            size += get_total_size(path)
            ftp.cwd(parent_dir)
        except:
            ftp.voidcmd('TYPE I')
            size += ftp.size(path)
    return size

Должен работать как шарм для всех.

person St4rb0y    schedule 23.07.2016

person    schedule
comment
Я получаю ftplib.error_perm: 550 SIZE not allowed in ASCII mode - person Frederik Voordeckers; 28.02.2014
comment
Чтобы избежать осложнений, я хотел бы указать вам на решение @FrederikVoordeckers. - person anon582847382; 28.02.2014
comment
@FrederikVoordeckers - та же ошибка, добавлено ftp.voidcmd('TYPE I') непосредственно перед ftp.size (файл), и это сработало - но, конечно, только для файлов, а не папок - person Greg Zaal; 19.04.2014
comment
@GregZaal: вы можете взглянуть на принятый ответ;) - person Frederik Voordeckers; 20.04.2014