登录
首页 >  Golang >  Go教程

Golang用io.Copy复制文件方法

时间:2026-04-25 11:30:32 386浏览 收藏

在Go语言中,使用io.Copy配合os.Open和os.Create是复制文件最简洁、高效且内存友好的方式——它自动以32KB缓冲区流式传输数据,无需手动管理读写循环,天然支持大文件;文章不仅给出了带完整错误处理和资源清理的可运行示例,还贴心补充了如何通过Chmod和Chtimes保留权限与时间戳等元信息,让开发者轻松实现媲美Linux cp -p的健壮文件拷贝功能。

如何使用Golang复制文件_结合io Copy和os包实现文件拷贝

使用 Go 语言复制文件最简洁、高效的方式是结合 io.Copyos 包,无需手动读写缓冲区,底层自动处理流式拷贝,支持大文件且内存占用低。

打开源文件和目标文件

os.Open 打开源文件(只读),用 os.Createos.OpenFile 创建/截断目标文件(可写)。注意检查错误,避免空指针或权限问题。

  • src, err := os.Open("source.txt")
  • if err != nil { log.Fatal(err) }
  • defer src.Close()
  • dst, err := os.Create("dest.txt")
  • if err != nil { log.Fatal(err) }
  • defer dst.Close()

调用 io.Copy 完成拷贝

io.Copy 从源 io.Reader 读取数据,写入目标 io.Writer,内部使用默认 32KB 缓冲区,适合绝大多数场景。它返回实际拷贝字节数和可能的错误。

  • n, err := io.Copy(dst, src)
  • 成功时 err == niln 为总字节数
  • 若需校验,可对比 nsrc.Stat().Size()

完整可运行示例

以下是一个带错误处理和资源清理的最小可行代码:

package main

import (
    "io"
    "log"
    "os"
)

func copyFile(srcPath, dstPath string) error {
    src, err := os.Open(srcPath)
    if err != nil {
        return err
    }
    defer src.Close()

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

    _, err = io.Copy(dst, src)
    return err
}

func main() {
    if err := copyFile("a.txt", "b.txt"); err != nil {
        log.Fatal(err)
    }
}

进阶建议:保留文件元信息

io.Copy 只复制内容,不保留修改时间、权限等。如需接近 cp -p 效果,可在拷贝后调用:

  • dst.Chmod(srcInfo.Mode()) —— 复制权限(需先 src.Stat()
  • dst.Chtimes(srcInfo.ModTime(), srcInfo.ModTime()) —— 复制时间戳
  • 注意:Windows 对 chmod 支持有限,部分模式会被忽略

好了,本文到此结束,带大家了解了《Golang用io.Copy复制文件方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>