使用os和io包可实现Golang文件复制,首先打开源文件并创建目标文件,通过io.Copy传输数据,并确保关闭文件。示例代码包含普通复制、带缓冲区优化及保留权限的复制方式,其中copyFileWithMode函数利用os.OpenFile传递源文件mode以保持权限,整个过程需注意错误处理与资源释放。

在Golang中实现文件复制功能,可以通过标准库 os 和 io 包完成。最常见的方式是使用 io.Copy 函数,结合文件的打开与关闭操作,安全高效地完成复制任务。
基本文件复制方法
使用 os.Open 打开源文件,用 os.Create 创建目标文件,再通过 io.Copy 将数据从源复制到目标。操作完成后记得关闭文件以释放资源。
- 打开源文件(只读模式)
- 创建目标文件(写入模式,若已存在则覆盖)
- 调用 io.Copy 完成数据传输
- 确保两个文件都正确关闭
示例代码:
func copyFile(src, dst string) error {
sourceFile, err := os.Open(src)
if err != nil {
return err
}
defer sourceFile.Close()
destinationFile, err := os.Create(dst)
if err != nil {
return err
}
defer destinationFile.Close()
_, err = io.Copy(destinationFile, sourceFile)
return err
}
带缓冲区的复制(可选优化)
默认的 io.Copy 已经使用内部缓冲,但你可以手动指定缓冲区大小来控制内存使用或提升特定场景下的性能,比如处理大文件时。
立即学习“go语言免费学习笔记(深入)”;
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
使用 io.CopyBuffer 可自定义缓冲区:
buf := make([]byte, 32*1024) // 32KB 缓冲区 _, err = io.CopyBuffer(destinationFile, sourceFile, buf)
保留文件权限的复制
如果希望目标文件保持源文件的权限(如可执行权限),可以在创建目标文件时传入源文件的 file mode。
获取源文件信息:
sourceInfo, err := os.Stat(src)
if err != nil {
return err
}
destinationFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, sourceInfo.Mode())
完整示例:支持权限保留的复制函数
func copyFileWithMode(src, dst string) error {
source, err := os.Open(src)
if err != nil {
return err
}
defer source.Close()
sourceInfo, err := source.Stat()
if err != nil {
return err
}
destination, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, sourceInfo.Mode())
if err != nil {
return err
}
defer destination.Close()
_, err = io.Copy(destination, source)
return err
}
基本上就这些。Golang的标准库已经提供了足够简洁且可靠的方式来实现文件复制,不需要依赖外部包。只要注意错误处理和资源释放,就能写出健壮的文件操作代码。









