2014-02-28 113 views
1

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

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

那么有谁知道如何使用FtpLib获取文件夹的大小?

+0

我不知道是否有准备使用Python的lib /模块,但ftp的结构不允许这样做。看来你必须在你的代码中的一个文件夹下总结文件大小,并且你必须递归地获得文件夹大小。 – obayhan

回答

4

经过一些试验和错误,我找到了解决方案。

它基于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

我认为这个脚本中的自我是不必要的! – multigoodverse

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

我得到'ftplib.error_perm:550 SIZE不允许在ASCII模式下使用' –

+0

为了避免出现复杂情况,我会将您指向@FrederikVoordeckers的解决方案。 –

+1

@FrederikVoordeckers - 得到了同样的错误,在ftp.size(文件)之前添加了'ftp.voidcmd('TYPE I')',但它只适用于文件,当然不是文件夹 –

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 

应该像每个人的魅力。