Get folder size using FtpLib

前端 未结 3 1108
说谎
说谎 2021-01-03 11:17

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 docume

相关标签:
3条回答
  • 2021-01-03 11:56

    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
    
    0 讨论(0)
  • 2021-01-03 11:58
    def get_size(directory):
        size = 0
        for file in FTP.nlst(directory):
            size += FTP.size(file)
        return size
    
    0 讨论(0)
  • 2021-01-03 12:08

    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.

    0 讨论(0)
提交回复
热议问题