Получить размер папки с помощью 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
Должен работать как шарм для всех.