code: def copy_dir(sou_dir, dst_dir, del_dst=False, del_subdst=False):
      
      if del_dst and os.path.isdir(del_dst):
          shutil.rmtree(dst_dir)
      os.makedirs(dst_dir, exist_ok=True)
      for cur_file in list_dir(sou_dir):
          dst_file = os.path.join(dst_dir, cur_file)
          cur_file = os.path.join(sou_dir, cur_file)
          if os.path.isdir(cur_file):
              if del_subdst and os.path.isdir(dst_file):
                  shutil.rmtree(dst_file)
              os.makedirs(dst_file, exist_ok=True)
              copy_dir(cur_file, dst_file)
          else:
              shutil.copyfile(cur_file, dst_file)
docs: :func:`shutil.copytree()` 也能实现类似功能，
      但前者要求目标文件夹必须不存在。
      而 copy_dir 没有这个要求，它可以将 sou_dir 中的文件合并到 dst_dir 中。
  
      :param str sou_dir: 待复制的文件夹；
      :param str dst_dir: 目标文件夹；
      :param bool del_dst: 是否删除目标文件夹。
      :param bool del_subdst: 是否删除目标子文件夹。