def copy_file(source_file, destination_file, soft_link=False):
    """
    :param source_file: str of the full path to the source file
    :param destination_file: str of the full path to the destination file
    :param soft_link: bool if True will soft link if possible
    :return: None
    """
    if not os.path.exists(source_file):
        raise IOError("No such file: %s" % source_file)
    mkdir_for_file(destination_file)
    if os.path.exists(destination_file):
        os.remove(destination_file)

    if os.name == 'posix' and soft_link:
        try:
            os.symlink(source_file, destination_file)
        except:
            shutil.copy(source_file, destination_file)
    else:
        try:
            shutil.copy(source_file, destination_file)
        except Exception:
            raise