Get folder size using FtpLib

不羁的心 提交于 2020-01-21 09:17:45

问题


I'm using FtpLib (Python) to download a folder with files from an ftp server. But I want to know the size of the folder before I start downloading it.

In the documentation I found FTP.size(filename) but that's just for files and not for folders... I could loop through all the files in the folder but it is possible that the folder contains subfolders.

So does anyone know how to get the size of the folder using FtpLib?


回答1:


After some trial and error I found the solution.

It's based on Alex Thorntons solution but I kept in mind that there could be subfolders. When it's a folder, the ftp.cwd() command succeeds and the function is called recursively.

When the ftp.cwd() command throws an error, it was a file and we can get the file size. The type is set to "I" (images), this forces binary mode since the ftp.size() command is not allowed in ASCII mode.

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



回答2:


def get_size(directory):
    size = 0
    for file in FTP.nlst(directory):
        size += FTP.size(file)
    return size



回答3:


Frederik Voordeckers' solution didn't work for me. When the method is called recursively, when dealing with a structure of subfolders, it raises the error 550 directory/.../sub_directory: No such file or directory.
I did modify his original code, by deleting the "self-declarations", since I did not use the method inside a class. This might have caused the error. I don't know.

Here is my solution:

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

Should work like a charm for everyone.



来源:https://stackoverflow.com/questions/22090001/get-folder-size-using-ftplib

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!