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

Go中复制文件最简洁高效的方式是用io.Copy配合os.Open和os.Create,自动流式拷贝、内存占用低;需错误处理与defer关闭,进阶可补充Chmod和Chtimes保留元信息。

使用 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(dst

Path) 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 支持有限,部分模式会被忽略