如何使用Golang实现文件拷贝_读取源文件写入目标文件
发布时间 - 2026-01-03 00:00:00 点击率:次推荐使用 io.Copy 配合 os.Open 和 os.Create 实现高效安全的文件拷贝;需 defer 关闭文件句柄;若保留权限和时间戳,应调用 os.Stat 获取信息后用 Chmod/Chtimes 设置;小文件可用 ReadFile/WriteFile 简化操作但不适用于大文件。
用 Go 实现文件拷贝,核心思路是:打开源文件读取内容,再写入目标文件。推荐使用 io.Copy,它内部做了缓冲优化,比手动读写更高效、更安全。
基础方式:io.Copy + os.Open / os.Create
这是最常用也最推荐的方式,适合大多数场景(包括大文件):
- 用
os.Open打开源文件(只读) - 用
os.Create创建或截断目标文件(可写) - 调用
io.Copy(dst, src)完成流式拷贝 - 务必关闭两个文件句柄,建议用
defer
示例代码:
package main
import (
"io"
"log"
"os"
)
func copyFile(src, dst string) error {
source, err := os.Open(src)
if err != nil {
return err
}
defer source.Close()
dest, err := os.Create(dst)
if err != nil {
return err
}
defer dest.Close()
_, err = io.Copy(dest, source)
return err
}
func main() {
if err := copyFile("a.txt", "b.txt"); err != nil {
log.Fatal(err)
}
}
带权限和时间戳的拷贝(类似 cp -p)
如果需要保留源文件的权限(mode)、修改时间(ModTime),需额外获取并设置:
立即学习“go语言免费学习笔记(深入)”;
- 用
os.Stat获取源文件os.FileInfo - 创建目标文件后,用
dest.Chmod和dest.Chtimes设置属性
注意:os 默认权限是
.Create0666,会被 umask 限制;建议先用 os.OpenFile 配合 os.O_CREATE|os.O_WRONLY,再显式 Chmod。
小文件直接读全部再写入(不推荐用于大文件)
仅适用于确定很小的文件(如配置文件),代码简洁但会占用内存:
- 用
os.ReadFile一次性读入字节切片 - 用
os.WriteFile一次性写入目标文件 - 自动处理打开/关闭,无需 defer,但无流控、不省内存
示例:
data, err := os.ReadFile("src.txt")
if err != nil {
log.Fatal(err)
}
err = os.WriteFile("dst.txt", data, 0644)
if err != nil {
log.Fatal(err)
}
错误处理与健壮性建议
生产环境建议增强以下细节:
- 检查源文件是否存在且可读:
os.IsNotExist(err) - 确保目标目录存在,缺失时用
os.MkdirAll(filepath.Dir(dst), 0755) - 拷贝前可先校验源文件大小(避免空文件误拷)
- 若需原子性,可先写入临时文件,成功后再
os.Rename替换目标
# go
# golang
# 字节
# ai
# 配置文件
# 切片
# copy
# 句柄
# 推荐使用
# 适用于
# 大文件
# 可先
# 再写
# 这是
# 但不
# 省内
# 先用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在云主机快速搭建网站站点?
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何在服务器上三步完成建站并提升流量?
node.js报错:Cannot find module 'ejs'的解决办法
EditPlus中的正则表达式实战(5)
php结合redis实现高并发下的抢购、秒杀功能的实例
java获取注册ip实例
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何将凡科建站内容保存为本地文件?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何快速上传自定义模板至建站之星?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
HTML 中如何正确使用模板变量为元素的 name 属性赋值
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
非常酷的网站设计制作软件,酷培ai教育官方网站?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
香港服务器租用费用高吗?如何避免常见误区?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何在腾讯云服务器快速搭建个人网站?
php 三元运算符实例详细介绍
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
网站图片在线制作软件,怎么在图片上做链接?
如何快速查询网站的真实建站时间?
Python结构化数据采集_字段抽取解析【教程】
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
公司网站制作价格怎么算,公司办个官网需要多少钱?
简单实现Android文件上传
网易LOFTER官网链接 老福特网页版登录地址
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何用y主机助手快速搭建网站?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
phpredis提高消息队列的实时性方法(推荐)
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Android 常见的图片加载框架详细介绍
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
如何快速查询网址的建站时间与历史轨迹?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何有效防御Web建站篡改攻击?

