使用FtpLib获取文件夹大小

时间:2014-02-28 08:34:49

标签: python ftp ftplib

我正在使用FtpLib(Python)从ftp服务器下载包含文件的文件夹。但是我想在开始下载之前知道文件夹的大小。

在文档中我发现FTP.size(filename)但这只是文件而不是文件夹...我可以遍历文件夹中的所有文件,但文件夹可能包含子文件夹。

所以有人知道如何使用FtpLib获取文件夹的大小吗?

3 个答案:

答案 0 :(得分:5)

经过一些反复试验,我找到了解决方案。

它基于Alex Thorntons解决方案,但我记得可能有子文件夹。 当它是一个文件夹时,ftp.cwd()命令会成功,并且递归调用该函数。

ftp.cwd()命令抛出错误时,它是一个文件,我们可以获取文件大小。类型设置为“I”(图像),这会强制二进制模式,因为在ASCII模式下不允许ftp.size()命令。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

Frederik Voordeckers的解决方案对我不起作用。当递归调用该方法时,在处理子文件夹的结构时,会引发错误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

应该像每个人的魅力一样。