Go语言的文件操作主要依赖os包和io包,通过灵活组合这些包提供的函数和方法,可以实现高效、安全的文件读写。以下是详细的文件操作方法及示例:
1. 打开文件- os.Open(name string) (*os.File, error)以只读模式打开文件,若文件不存在或无权限则返回错误。示例:file, err := os.Open("example.txt")if err != nil { log.Fatal(err)}defer file.Close()
2. 创建文件- os.Create(name string) (*os.File, error)创建新文件,若文件已存在则覆盖原有内容。示例:file, err := os.Create("newfile.txt")if err != nil { log.Fatal(err)}defer file.Close()
3. 灵活打开或创建文件os.OpenFile(name string, flag int, perm os.FileMode) (*os.File, error)通过flag参数控制打开模式(如追加、读写),perm参数设置文件权限。常用flag值:
os.O_RDONLY:只读
os.O_WRONLY:只写
os.O_RDWR:读写
os.O_APPEND:追加
os.O_CREATE:文件不存在则创建
os.O_TRUNC:清空文件内容
示例:以追加模式打开文件,若不存在则创建,权限为0644(所有者可读写,其他用户只读)。
file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)if err != nil { log.Fatal(err)}defer file.Close()
4. 读取文件小文件读取(一次性)- ioutil.ReadFile(filename string) ([]byte, error)适用于小文件,直接读取全部内容到字节切片。示例:content, err := ioutil.ReadFile("small.txt")if err != nil { log.Fatal(err)}fmt.Printf("File content: %sn", content)
大文件分块读取- bufio.NewReader(r io.Reader)创建带缓冲的读取器,分块读取文件内容,避免内存溢出。示例:file, err := os.Open("large_file.txt")if err != nil { log.Fatal(err)}defer file.Close()reader := bufio.NewReader(file)buffer := make([]byte, 4096) // 4KB缓冲区for { n, err := reader.Read(buffer) if n > 0 { fmt.Print(string(buffer[:n])) } if err != nil { if err == io.EOF { fmt.Println("nEnd of file") } else { log.Fatal(err) } break }}
5. 写入文件小文件写入(一次性)- ioutil.WriteFile(filename string, data []byte, perm os.FileMode)适用于小文件,直接写入全部内容。示例:data := []byte("Hello, Go!")err := ioutil.WriteFile("output.txt", data, 0644)if err != nil { log.Fatal(err)}
大文件缓冲写入- bufio.NewWriter(w io.Writer)创建带缓冲的写入器,提高写入效率,需手动调用Flush()确保数据落盘。示例:file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)if err != nil { log.Fatal(err)}defer file.Close()writer := bufio.NewWriter(file)data := "This is some data to write to the file.n"_, err = writer.WriteString(data)if err != nil { log.Fatal(err)}err = writer.Flush() // 确保缓冲区数据写入磁盘if err != nil { log.Fatal(err)}
6. 关闭文件- file.Close()务必在操作完成后关闭文件,释放资源。推荐使用defer延迟关闭。示例:file, err := os.Open("example.txt")if err != nil { log.Fatal(err)}defer file.Close() // 确保函数退出前关闭文件
7. 错误处理Go语言通过多返回值传递错误,需显式检查每个操作的错误。示例:
file, err := os.Open("nonexistent.txt")if err != nil { if os.IsNotExist(err) { fmt.Println("File does not exist") } else { log.Fatal(err) } return}defer file.Close()8. 处理文件权限问题- 检查文件是否存在:os.Stat(name string) (os.FileInfo, error)
- 设置权限:通过os.OpenFile的perm参数或os.Chmod(name string, mode os.FileMode) error修改权限。示例:filename := "protected.txt"_, err := os.Stat(filename)if os.IsNotExist(err) { file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY, 0600) // 仅所有者可读写 if err != nil { log.Fatal(err) } defer file.Close() fmt.Println("File created with restricted permissions.")} else { err = os.Chmod(filename, 0600) // 修改现有文件权限 if err != nil { log.Fatal(err) }}
总结- 核心包:os(文件操作)、io(读写接口)、bufio(缓冲读写)、ioutil(简化操作)。
- 关键步骤:打开/创建文件 → 读写操作 → 关闭文件 → 错误处理。
- 性能优化:大文件使用缓冲读写(bufio),确保数据落盘(Flush和Sync)。
- 安全建议:检查文件权限,处理错误,避免资源泄露。
通过以上方法,可以高效、安全地完成Go语言的文件操作任务。