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

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

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

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

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
def get_size(directory):
    size = 0
    for file in FTP.nlst(directory):
        size += FTP.size(file)
    return size

Решение Фредерика Вурдеккера не сработало для меня. Когда метод вызывается рекурсивно, при работе со структурой подпапок возникает ошибка 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

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

Другие вопросы по тегам