在 Go 语言中操作文件系统:从基础到高级技术
Go(Golang)是一种现代编译型编程语言,以其性能、简洁性以及对文件系统的内置支持而闻名。高效地读取、写入、创建和管理文件与目录的能力是每位 Go 开发者的关键技能之一。在本文中,我们将使用标准库 os、io/ioutil(从 Go 1.16 开始,建议使用 os 和 io)以及 path/filepath,深入讲解基本的文件系统操作。你将学习如何打开和关闭文件、读取和写入数据、操作目录以及遍历文件树。
1. 基础:打开、读取和写入文件
在 Go 中操作文件从 os 包开始。要打开文件,请使用 os.Open 函数(只读)或 os.OpenFile(用于读写并指定模式)。操作完成后,必须使用 defer file.Close() 关闭文件,以释放系统资源。
完整读取文件
读取文件最简单的方法是使用 os.ReadFile(自 Go 1.16 起可用)。它返回一个字节切片和一个错误。
package main
import ( "fmt" "os")
func main() { data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("Error reading file:", err) return } fmt.Println("File contents:") fmt.Println(string(data))}写入文件
要将数据写入文件,请使用 os.WriteFile。它会创建或覆盖文件。
package main
import ( "os")
func main() { content := []byte("Hello, world!This is a line to write.") err := os.WriteFile("output.txt", content, 0644) if err != nil { panic(err) }}注意第三个参数——0644。这是 Unix 风格的文件权限(所有者可读写,其他人只能读取)。
使用缓冲进行读写
对于大文件或流式处理,请使用 bufio:
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("large.txt") if err != nil { panic(err) } defer file.Close()
scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("Scanning error:", err) }}2. 操作目录
Go 提供了用于创建、删除和读取目录的便捷函数。主要函数位于 os 包中。
创建目录
要创建单个目录,请使用 os.Mkdir;要创建嵌套目录,请使用 os.MkdirAll。
package main
import ( "os")
func main() { // Create a single directory err := os.Mkdir("newdir", 0755) if err != nil { panic(err) }
// Create nested directories err = os.MkdirAll("path/to/nested/dir", 0755) if err != nil { panic(err) }}读取目录内容
os.ReadDir 函数返回目录中的条目列表(自 Go 1.16 起)。
package main
import ( "fmt" "os")
func main() { entries, err := os.ReadDir(".") if err != nil { panic(err) }
for _, entry := range entries { fmt.Println(entry.Name(), entry.IsDir()) }}删除文件和目录
要删除,请使用 os.Remove(用于文件或空目录)和 os.RemoveAll