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 的预期行为,不是 bugfunc 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
}
os.FileInfo
io.Copy 只管字节流,不碰文件系统元数据。如果要让目标文件和源文件权限一致(比如可执行位)、修改时间一致,得额外调用 os.Chmod 和 os.Chtimes。
os.Stat 获取 Mode(),再传给 os.Chmod
os.Chtimes(dst, info.ModTime(), info.ModTime()),第二个参数是访问时间,第三个是修改时间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语言免费学习笔记(深入)”;
os.Open 会成功,但 io.Copy 读不到数据Write 调用可能挂起数分钟defer file.Close(),导致文件句柄泄漏,后续操作失败os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0) 但没设权限掩码(第三个参数为 0)→ 创建的文件不可读,后续操作报错io.Copy
多个 io.Copy 并发跑本身没问题,但要注意资源竞争点:
os.Create 可能互相覆盖,且无原子性保障io.Copy 内部加锁更新全局变量,改用 io.MultiWriter 或封装带回调的 reader元数据同步、错误聚合、限速控制这些事,io. 一律不管——得自己补全逻辑,不是加个
Copygo 就万事大吉。
# 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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。