将所有包含文件的目录从 FTP 复制到本地目录

问题描述

我正在尝试将所有目录、子目录和文件从 FTP 服务器复制到本地目录。部分文件复制成功,但FTP中存在的其余文件出现550 File not found,将带扩展名的文件名复制到本地目录中,但文件已损坏并且无法使用。其余文件在复制时损坏是什么原因?

import errno
import os.path
import sys
from ftplib import FTP,error_perm

host = 'localhost'
username = 'user'
password = 'pass'
port = 21
ftp = FTP()
ftp.connect(host,port)
ftp.login(username,password)
filenameCV = "path/to/directory"

ftp.set_debuglevel(2)

def get_all_files_and_directories(path,destination):
    try:
        ftp.cwd(path)
        os.chdir(destination)
        mkdir_p(destination[0:len(destination)] + path)
        # print("Created: " + destination[0:len(destination)] + path)
    except OSError:
        pass
    except error_perm:
        # print("Error: Could not change to " + path)
        sys.exit("Ending Application")

    file_list = ftp.nlst()

    for file in file_list:
        try:
            ftp.cwd(path + file + "/")
            get_all_files_and_directories(path + file + "/",destination)
        except error_perm:
            os.chdir(destination[0:len(destination)] + path)

            try:
                ftp.retrbinary("RETR " + file,open(os.path.join(destination + path,file),"wb").write)
                # print("Downloaded: " + file)
            except Exception as er:
                print(er)
                print("Error: File Could not be downloaded " + file)
    return


def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc:
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else:
            raise


get_all_files_and_directories("/",filenameCV)
ftp.quit()

FTP 日志如下所示:

*get* '229 Entering Extended Passive Mode (|||58687|)\n'
*resP* '229 Entering Extended Passive Mode (|||58687|)'
*cmd* 'RETR sumNumbers.js'
*put* 'RETR sumNumbers.js\r\n'
*get* '150 opening data channel for file download from server of "/JavaScript/While-Loop/sumNumbers.js"\n'
*resP* '150 opening data channel for file download from server of "/JavaScript/While-Loop/sumNumbers.js"'
*get* '226 Successfully transferred "/JavaScript/While-Loop/sumNumbers.js"\n'
*resP* '226 Successfully transferred "/JavaScript/While-Loop/sumNumbers.js"'
*cmd* 'CWD /JavaScript/While-Loop-Advanced/'
*put* 'CWD /JavaScript/While-Loop-Advanced/\r\n'
*get* '250 CWD successful. "/JavaScript/While-Loop-Advanced" is current directory.\n'
*resP* '250 CWD successful. "/JavaScript/While-Loop-Advanced" is current directory.'
*cmd* 'CWD /JavaScript/While-Loop-Advanced/'
*put* 'CWD /JavaScript/While-Loop-Advanced/\r\n'
*get* '250 CWD successful. "/JavaScript/While-Loop-Advanced" is current directory.\n'
*resP* '250 CWD successful. "/JavaScript/While-Loop-Advanced" is current directory.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A\n'
*resP* '200 Type set to A'
*cmd* 'EPSV'
*put* 'EPSV\r\n'
*get* '229 Entering Extended Passive Mode (|||52371|)\n'
*resP* '229 Entering Extended Passive Mode (|||52371|)'
*cmd* 'NLST'
*put* 'NLST\r\n'
*get* '150 opening data channel for directory listing of "/JavaScript/While-Loop-Advanced"\n'
*resP* '150 opening data channel for directory listing of "/JavaScript/While-Loop-Advanced"'
*get* '226 Successfully transferred "/JavaScript/While-Loop-Advanced"\n'
*resP* '226 Successfully transferred "/JavaScript/While-Loop-Advanced"'
*cmd* 'CWD /JavaScript/While-Loop-Advanced/05.3 PB-JS-While-Loop-Exercise.docx/'
*put* 'CWD /JavaScript/While-Loop-Advanced/05.3 PB-JS-While-Loop-Exercise.docx/\r\n'
*get* '550 CWD Failed. "/JavaScript/While-Loop-Advanced/05.3 PB-JS-While-Loop-Exercise.docx": directory not found.\n'
*resP* '550 CWD Failed. "/JavaScript/While-Loop-Advanced/05.3 PB-JS-While-Loop-Exercise.docx": directory not found.'
*cmd* 'CWD /JavaScript/While-Loop-Advanced/coins.js/'
*put* 'CWD /JavaScript/While-Loop-Advanced/coins.js/\r\n'
*get* '550 CWD Failed. "/JavaScript/While-Loop-Advanced/coins.js": directory not found.\n'
*resP* '550 CWD Failed. "/JavaScript/While-Loop-Advanced/coins.js": directory not found.'

错误调用堆栈是:

550 File not found
Traceback (most recent call last):
  File "ftp_client.py",line 34,in get_all_files_and_directories
    ftp.cwd(path + file + "/")
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 631,in cwd
    return self.voidcmd(cmd)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 278,in voidcmd
    return self.voidresp()
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 251,in voidresp
    resp = self.getresp()
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 246,in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 CWD Failed. "/bamboo_inventory/yarn.lock": directory not found.

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "ftp_client.py",line 41,in get_all_files_and_directories
    open(os.path.join(destination + path,"wb").write)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 442,in retrbinary
    with self.transfercmd(cmd,rest) as conn:
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 399,in transfercmd
    return self.ntransfercmd(cmd,rest)[0]
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 365,in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",line 273,in sendcmd
    return self.getresp()
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\python37_64\lib\ftplib.py",in getresp
    raise error_perm(resp)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...