我正在使用FtpLib(Python)從ftp服務器下載包含文件的文件夾。但是我想在開始下載之前知道文件夾的大小。使用FtpLib獲取文件夾大小
在文檔中我發現FTP.size(filename)
但這只是文件而不是文件夾......我可以循環瀏覽文件夾中的所有文件,但文件夾可能包含子文件夾。
那麼有誰知道如何使用FtpLib獲取文件夾的大小?
我正在使用FtpLib(Python)從ftp服務器下載包含文件的文件夾。但是我想在開始下載之前知道文件夾的大小。使用FtpLib獲取文件夾大小
在文檔中我發現FTP.size(filename)
但這只是文件而不是文件夾......我可以循環瀏覽文件夾中的所有文件,但文件夾可能包含子文件夾。
那麼有誰知道如何使用FtpLib獲取文件夾的大小?
經過一些試驗和錯誤,我找到了解決方案。
它基於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
我認爲這個腳本中的自我是不必要的! – multigoodverse
def get_size(directory):
size = 0
for file in FTP.nlst(directory):
size += FTP.size(file)
return size
我得到'ftplib.error_perm:550 SIZE不允許在ASCII模式下使用' –
爲了避免出現複雜情況,我會將您指向@FrederikVoordeckers的解決方案。 –
@FrederikVoordeckers - 得到了同樣的錯誤,在ftp.size(文件)之前添加了'ftp.voidcmd('TYPE I')',但它只適用於文件,當然不是文件夾 –
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
應該像每個人的魅力。
我不知道是否有準備使用Python的lib /模塊,但ftp的結構不允許這樣做。看來你必須在你的代碼中的一個文件夾下總結文件大小,並且你必須遞歸地獲得文件夾大小。 – obayhan