Go语言文件系统操作实战指南
Go (Golang) 是一种现代编译型语言,非常适合开发服务端应用、命令行工具和实用程序。这类项目中的关键任务之一就是文件系统操作。本文将介绍实用示例:从文件的打开和读取到递归遍历目录。所有示例均使用纯Go编写,无需第三方库。
基础:文件的打开、读取和写入
os包提供了底层文件操作函数。要读取整个文件内容到内存,请使用os.ReadFile(自Go 1.16起可用)。
package main
import ( "fmt" "os")
func main() { data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("读取文件错误:", err) return } fmt.Println(string(data))}向文件写入数据可使用os.WriteFile函数。如果文件不存在则创建,如果存在则覆盖。
package main
import ( "fmt" "os")
func main() { content := []byte("Hello, Go!第二行") err := os.WriteFile("output.txt", content, 0644) if err != nil { fmt.Println("写入错误:", err) return } fmt.Println("文件写入成功")}第三个参数0644是Unix风格的权限设置(所有者可读写,其他人只读)。在Windows系统中此参数部分被忽略。
流式读写:处理大文件
处理大文件(超过几兆字节)时,不应将整个文件加载到内存中。应使用bufio进行缓冲读取,或使用io包。
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("large_file.log") if err != nil { fmt.Println("打开错误:", err) return } defer file.Close()
scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() // 处理每一行 fmt.Println(line) }
if err := scanner.Err(); err != nil { fmt.Println("扫描错误:", err) }}流式写入请使用bufio.NewWriter:
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Create("output_stream.txt") if err != nil { fmt.Println("创建错误:", err) return } defer file.Close()
writer := bufio.NewWriter(file) for i := 0; i < 10; i++ { _, err := writer.WriteString(fmt.Sprintf("第%d行", i+1)) if err != nil { fmt.Println("写入错误:", err) return } } writer.Flush() // 重要:刷新缓冲区 fmt.Println("写入完成")}Flush()方法是必须调用的——否则数据可能留在缓冲区而无法写入文件。
目录操作:创建、删除和遍历
创建新目录可使用os.Mkdir(单个文件夹)或os.MkdirAll(递归创建,类似mkdir -p)。
package main
import ( "fmt" "os")
func main() { // 创建单个文件夹 err := os.Mkdir("new_folder", 0755) if err != nil { fmt.Println("创建文件夹错误:", err) }
// 创建嵌套目录结构 err = os.MkdirAll("a/b/c/d", 0755) if err != nil { fmt.Println("创建嵌套文件夹错误:", err) } else { fmt.Println("文件夹创建成功") }}删除目录使用os.Remove(仅删