用 io.Copy 复制文件最稳妥,因其内存可控、错误自动传播;需手动同步权限和时间戳,大文件应加校验与断点续传,并发复制须限流避免I/O瓶颈。
用 io.Copy 复制文件最稳妥
Go 标准库没有直接的 “复制文件” 函数,但 io.Copy 是最常用、最可靠的选择。它不关心内容类型,只做字节流搬运,内存占用可控(默认 32KB 缓冲),且自动处理读写错误传播。
常见错误是手动 os.ReadFile + os.WriteFile:小文件看似简单,大文件会吃光内存;而且没做原子性保障,中断时可能留下损坏文件。
- 先
os.Open源文件,再os.Create目标文件(注意用defer dst.Close()) - 调用
io.Copy(dst, src),检查返回的error—— 即使复制了部分数据,出错也要视为失败 - 复制完成后,建议用
dst.Sync()强制刷盘,避免缓存未落盘(尤其对关键数据)
需要保留权限和时间戳?用 os.Stat + os.Chmod + os.Chtimes
io.Copy 只管内容,不碰元数据。若需完整克隆(比如备份场景),必须手动同步 Mode 和 ModTime。
注意:os.Chmod 对 Windows 的只读属性有效,但无法设置 Unix 权限位(如 setuid);os.Chtimes 在某些文件系统(如 FAT32)上可能被忽略。