如何解决将所有包含文件的目录从 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 举报,一经查实,本站将立刻删除。