Скопируйте все каталоги с файлами с FTP в локальный каталог

Я пытаюсь скопировать все каталоги, подкаталоги и файлы с 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)

person Sani    schedule 07.06.2021    source источник