Я пытаюсь скопировать все каталоги, подкаталоги и файлы с FTP-сервера в локальный каталог. Часть файлов копируется успешно, но для остальных возникает ошибка 550 File not found, которые существуют на FTP и имена файлов с расширениями копируются в локальную директорию, но файлы повреждаются и не пригодный для использования. В чем причина повреждения остальных файлов при копировании?
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, file), "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", line 246, in getresp
raise error_perm(resp)