章节

14.7 文件复制

本篇学习使用 io.Copy 复制文件内容,并能完成基础文件复制流程。

文件复制

概念说明

文件复制的核心是:打开源文件,创建目标文件,把源文件内容写入目标文件。
标准库 io.Copy 可以把一个 Reader 的内容复制到一个 Writer

*os.File 同时实现了读取和写入相关接口。
因此它可以直接配合 io.Copy 使用。

语法/规则

  1. 使用 os.Open 打开源文件。
  2. 使用 os.Create 创建目标文件。
  3. 使用 io.Copy(dst, src) 复制内容。
  4. 复制完成后要关闭两个文件。
  5. 应检查打开、创建和复制过程中的错误。

文件复制示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	srcPath := "source.txt"
	dstPath := "target.txt"

	err := os.WriteFile(srcPath, []byte("copy me"), 0644)
	if err != nil {
		panic(err)
	}
	defer os.Remove(srcPath)
	defer os.Remove(dstPath)

	src, err := os.Open(srcPath)
	if err != nil {
		panic(err)
	}
	defer src.Close()

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

	_, err = io.Copy(dst, src) // 把源文件内容复制到目标文件
	if err != nil {
		panic(err)
	}

	data, err := os.ReadFile(dstPath)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(data))
}

输出结果:

1
copy me

常见错误

  1. 源文件和目标文件路径写反,导致覆盖了原文件。
  2. 复制后不检查 io.Copy 的错误,无法发现复制中断。
  3. 忘记关闭目标文件,导致内容可能没有及时落盘。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字