文件处理是编程中最常用的功能之一,无论是读取配置、写入日志、处理文本,还是数据存储,都离不开文件操作。Go 语言提供了非常简洁、强大的标准库来完成文件的创建、读写、复制、删除、判断等操作,最核心的包是 os 和 io/ioutil (Go 1.16 后推荐使用 os 和 io)。
本文从最基础到最常用,一步步讲解,代码可直接复制运行,适合作业、考试、实战使用。
一、文件操作必备包
Go 语言文件操作主要使用 3 个包:
- os:文件打开、创建、删除、权限、状态判断
- bufio:带缓冲的读写(高效读写大文件)
- io:基础读写接口
- path/filepath:路径处理(跨平台)
二、文件打开与关闭
1. 打开文件(os.Open)
file, err := os.Open("test.txt")
作用:以只读方式打开文件。
2. 创建文件(os.Create)
file, err := os.Create("test.txt")
作用:创建新文件,若文件已存在则清空内容。
3. 打开文件并指定模式(os.OpenFile)
最强大的打开方式,可指定:
-
只读
-
只写
-
追加
-
读写
file, err := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY, 0666)
常用模式:
os.O_RDONLY:只读os.O_WRONLY:只写os.O_RDWR:读写os.O_CREATE:不存在则创建os.O_APPEND:追加写os.O_TRUNC:清空文件
4. 关闭文件(defer file.Close ())
文件打开后必须关闭,否则会造成资源泄漏。固定写法:
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("打开失败:", err)
return
}
defer file.Close() // 自动关闭
三、文件读取操作(4 种常用方法)
1. 一次性读取全部内容(最简单)
content, err := os.ReadFile("test.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(content))
优点:代码少,适合小文件。
2. 按字节读取
buf := make([]byte, 1024)
n, _ := file.Read(buf)
fmt.Println("读取字节数:", n)
fmt.Println("内容:", string(buf[:n]))
3. 按行读取(最常用,适合大文件)
使用 bufio.Scanner 按行读取:
file, _ := os.Open("test.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
fmt.Println(line)
}
4. 带缓冲读取(高效读取大文件)
reader := bufio.NewReader(file)
buf := make([]byte, 1024)
reader.Read(buf)
四、文件写入操作
1. 一次性写入(最简单)
content := "Hello Go 文件操作"
err := os.WriteFile("test.txt", []byte(content), 0666)
特点:覆盖原有内容。
2. 追加写入
必须使用 OpenFile 并指定追加模式:
file, err := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
defer file.Close()
file.WriteString("我是追加的内容\n")
3. 缓冲写入(高效写入)
writer := bufio.NewWriter(file)
writer.WriteString("使用缓冲写入\n")
writer.Flush() // 必须刷新才会真正写入文件
五、文件常用操作
1. 判断文件是否存在
_, err := os.Stat("test.txt")
if os.IsNotExist(err) {
fmt.Println("文件不存在")
} else {
fmt.Println("文件存在")
}
2. 删除文件
err := os.Remove("test.txt")
3. 获取文件信息
info, _ := os.Stat("test.txt")
fmt.Println("文件名:", info.Name())
fmt.Println("文件大小:", info.Size())
fmt.Println("是否是目录:", info.IsDir())
fmt.Println("修改时间:", info.ModTime())
4. 创建目录
os.Mkdir("test", 0777) // 创建单个目录
os.MkdirAll("a/b/c", 0777) // 递归创建多级目录
5. 遍历目录
files, _ := os.ReadDir(".")
for _, file := range files {
fmt.Println(file.Name())
}
六、文件复制
src, _ := os.Open("src.txt")
dst, _ := os.Create("dst.txt")
defer src.Close()
defer dst.Close()
io.Copy(dst, src)
七、文件操作易错点总结
- 打开文件必须判断错误,否则文件不存在会崩溃
- 必须 defer file.Close () 关闭文件
- 缓冲写入必须调用 Flush()
- 追加写入必须使用 os.O_APPEND 模式
- 小文件用
ReadFile/WriteFile,大文件用bufio - 跨平台路径使用
filepath.Join()
八、完整示例:读写小文件
package main
import "os"
func main() {
// 写入
os.WriteFile("test.txt", []byte("Go语言文件操作"), 0666)
// 读取
content, _ := os.ReadFile("test.txt")
println(string(content))
}