如何使用Golang复制文件_Golang io Copy文件拷贝示例


io.Copy 是最常用且稳妥的文件复制方式,自动处理缓冲、分块读写和错误传播,适合任意大小文件;但不保留权限、时间戳等元信息,需手动调用 os.Chmod 和 os.Chtimes 补全。

io.Copy 复制文件是最常用也最稳妥的方式

Go 标准库的 io.Copy 是专为流式拷贝设计的,底层自动处理缓冲、分块读写和错误传播,比手动 Read/Write 更安全、更高效。它不关心数据内容,只负责把一个 io.Reader 的所有字节完整送到 io.Writer,适合任意大小的文件(包括超大文件)。

常见错误是直接用 os.ReadFile + os.WriteFile —— 这会把整个文件一次性加载进内存,对 GB 级文件极易 OOM。

  • 必须确保源文件存在且可读,目标目录已存在(io.Copy 不创建父目录)
  • 目标文件若已存在,会被直接覆盖(无提示)
  • 复制后不会保留原文件的权限、时间戳等元信息——这是 io.Copy 的预期行为,不是 bug
func copyFile(src, dst string) error {
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer srcFile.Close()

	dstFile, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer dstFile.Close()

	_, err = io.Copy(dstFile, srcFile)
	return err
}

需要保留文件权限和 ModTime?得手动设置 os.FileInfo

io.Copy 只管字节流,不碰文件系统元数据。如果要让目标文件和源文件权限一致(比如可执行位)、修改时间一致,得额外调用 os.Chmodos.Chtimes

  • 权限需从 os.Stat 获取 Mode(),再传给 os.Chmod
  • 时间戳要用 os.Chtimes(dst, info.ModTime(), info.ModTime()),第二个参数是访问时间,第三个是修改时间
  • 注意:Windows 下 Chmod 对权限位的支持有限,部分位会被忽略
func copyFileWithMeta(src, dst string) error {
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer srcFile.Close()

	dstFile, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer dstFile.Close()

	_, err = io.Copy(dstFile, srcFile)
	if err != nil {
		return err
	}

	info, err := os.Stat(src)
	if err != nil {
		return err
	}

	err = os.Chmod(dst, info.Mode())
	if err != nil {
		return err
	}

	return os.Chtimes(dst, info.ModTime(), info.ModTime())
}

复制大文件时卡住?检查是否遗漏 Close 或用了阻塞 I/O

典型现象是程序在 io.Copy 调用处长时间无响应,但 CPU 占用低、磁盘无读写。这往往不是 io.Copy 本身的问题,而是上游或下游的 I/O 被阻塞:

立即学习“go语言免费学习笔记(深入)”;

  • 源文件被其他进程独占锁定(如 Windows 上用资源管理器打开着 txt 文件)→ os.Open 会成功,但 io.Copy 读不到数据
  • 目标路径是网络挂载盘(NFS/SMB),且连接不稳定 → Write 调用可能挂起数分钟
  • 忘记 defer file.Close(),导致文件句柄泄漏,后续操作失败
  • os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0) 但没设权限掩码(第三个参数为 0)→ 创建的文件不可读,后续操作报错

想并发复制多个文件?别直接开 goroutine 调 io.Copy

多个 io.Copy 并发跑本身没问题,但要注意资源竞争点:

  • 如果目标目录相同,多个 os.Create 可能互相覆盖,且无原子性保障
  • 大量并发读同一块 SSD/NVMe 盘,反而因随机 IO 降低吞吐;顺序读+单 goroutine 通常更快
  • 真正瓶颈常在磁盘或网络,而非 CPU —— 开 10 个 goroutine 不一定比 2 个快
  • 若需进度反馈,不要在 io.Copy 内部加锁更新全局变量,改用 io.MultiWriter 或封装带回调的 reader

元数据同步、错误聚合、限速控制这些事,io.Copy 一律不管——得自己补全逻辑,不是加个 go 就万事大吉。


# go  # windows  # golang  # 字节  # 资源管理器  # win  # 标准库  # 封装  # 全局变量  # copy  # 并发  # bug  # 多个  # 第三个  # 最常用  # 这是  # 句柄  # 万事大吉  # 用了  # 第二个  # 要用  # 更快 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++中引用和指针有什么区别?(代码说明)  Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复  c# 在ASP.NET Core中管理和取消后台任务  Python代码测试策略_质量保障解析【教程】  Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程  Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看  Win11怎么开启HDR模式_Windows 11高动态范围显示设置指南【详解】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何在 Go 应用中实现自动错误恢复与进程重启机制  Windows10无法连接到Internet_Win10网络重置命令详解  Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】  如何有效拦截拼接式恶意域名的垃圾信息  Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】  php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】  php下载安装后swoole扩展怎么安装_异步框架支持【汇总】  Win10怎么创建桌面快捷方式 Win10为应用创建快捷方式【步骤】  Win11任务栏怎么放到顶部_Win11修改任务栏位置方法【详细】  Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】  How to Properly Use NumPy in VS Code  Python网络异常模拟_测试说明【指导】  Mac怎么开启“任何来源”_Mac安装未签名应用的设置方法【解决】  Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】  Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】  如何在Golang中使用闭包_封装变量与函数作用域  Win11如何关闭游戏模式 Win11禁用Xbox Game Bar录制【优化】  Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法  Python生成器表达式内存优化_惰性计算说明【指导】  Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】  Win11怎么设置虚拟内存_Windows 11优化内存性能提升速度【技巧】  php8.4如何调用com组件_php8.4windows下com操作指南【教程】  Windows11如何设置专注助手_Windows11专注助手使用攻略【技巧】  MySQL 中使用 IF 和 CASE 实现查询字段的条件转换  Windows10系统怎么查看IP地址_Win10网络连接状态详细信息  全球各国上班时间表外贸邮件时间  php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】  如何在 Go 中正确测试带 Cookie 的 HTTP 请求  如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法  Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】  c++中如何进行二进制文件读写_c++ read与write函数用法 

 2026-01-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.