def _DoCopyFile(source_filename, target_filename, copy_symlink=True):
from six.moves.urllib.parse import urlparse<EOL>source_url = urlparse(source_filename)<EOL>target_url = urlparse(target_filename)<EOL>if _UrlIsLocal(source_url):<EOL><INDENT>if not Exists(source_filename):<EOL><INDENT>from ._exceptions import FileNotFoundError<EOL>raise FileNotFoundError(source_filename)<EOL><DEDENT>if _UrlIsLocal(target_url):<EOL><INDENT>_CopyFileLocal(source_filename, target_filename, copy_symlink=copy_symlink)<EOL><DEDENT>elif target_url.scheme in ['<STR_LIT>']:<EOL><INDENT>from ._exceptions import NotImplementedProtocol<EOL>raise NotImplementedProtocol(target_url.scheme)<EOL><DEDENT>else:<EOL><INDENT>from ._exceptions import NotImplementedProtocol<EOL>raise NotImplementedProtocol(target_url.scheme)<EOL><DEDENT><DEDENT>elif source_url.scheme in ['<STR_LIT:http>', '<STR_LIT>', '<STR_LIT>']:<EOL><INDENT>if _UrlIsLocal(target_url):<EOL><INDENT>from ._exceptions import NotImplementedProtocol<EOL>raise NotImplementedProtocol(target_url.scheme)<EOL><DEDENT>else:<EOL><INDENT>from ._exceptions import NotImplementedProtocol<EOL>raise NotImplementedProtocol(target_url.scheme)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>from ._exceptions import NotImplementedProtocol  <EOL>raise NotImplementedProtocol(source_url.scheme)<EOL><DEDENT>
:param unicode source_filename:
    The source filename.
    Schemas: local, ftp, http

:param unicode target_filename:
    Target filename.
    Schemas: local, ftp

:param  copy_symlink:
    @see _CopyFileLocal

:raises FileNotFoundError:
    If source_filename does not exist