插件窝 干货文章 Linux环境中Golang如何进行文件操作

Linux环境中Golang如何进行文件操作

文件 err file os 186    来源:    2025-05-09

Golang 文件操作指南 (Linux环境)

基本文件操作

1. 创建文件

file, err := os.Create("test.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

2. 打开文件

// 只读方式打开
file, err := os.Open("test.txt")

// 读写方式打开(如果不存在则创建)
file, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 0755)

3. 写入文件

// 直接写入字符串
_, err := file.WriteString("Hello, World!\n")

// 写入字节
data := []byte("Hello, World!\n")
_, err := file.Write(data)

// 使用bufio写入
writer := bufio.NewWriter(file)
_, err := writer.WriteString("Buffered write\n")
writer.Flush() // 确保所有缓冲数据写入底层io.Writer

4. 读取文件

// 读取整个文件
data, err := os.ReadFile("test.txt")

// 逐行读取
scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

// 读取到缓冲区
buf := make([]byte, 1024)
n, err := file.Read(buf)

5. 文件信息

info, err := os.Stat("test.txt")
if err != nil {
    log.Fatal(err)
}

fmt.Println("Name:", info.Name())
fmt.Println("Size:", info.Size())
fmt.Println("Mode:", info.Mode())
fmt.Println("ModTime:", info.ModTime())
fmt.Println("IsDir:", info.IsDir())

高级文件操作

1. 文件权限管理

// 更改文件权限
err := os.Chmod("test.txt", 0644)

// 更改文件所有者
err := os.Chown("test.txt", os.Getuid(), os.Getgid())

2. 文件链接

// 创建硬链接
err := os.Link("original.txt", "hardlink.txt")

// 创建符号链接
err := os.Symlink("original.txt", "symlink.txt")

// 读取符号链接目标
target, err := os.Readlink("symlink.txt")

3. 文件锁定 (Linux特有)

import "golang.org/x/sys/unix"

file, _ := os.OpenFile("test.txt", os.O_RDWR, 0666)
defer file.Close()

// 尝试获取排他锁
err := unix.Flock(int(file.Fd()), unix.LOCK_EX|unix.LOCK_NB)
if err != nil {
    log.Fatal("File is locked by another process")
}

// 释放锁
unix.Flock(int(file.Fd()), unix.LOCK_UN)

4. 内存映射文件 (Linux高效IO)

import "golang.org/x/sys/unix"

file, _ := os.OpenFile("largefile.bin", os.O_RDWR, 0644)
defer file.Close()

info, _ := file.Stat()
size := info.Size()

// 映射到内存
data, err := unix.Mmap(int(file.Fd()), 0, int(size), unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED)
if err != nil {
    log.Fatal(err)
}

// 使用映射的内存
copy(data, []byte("Hello from mmap"))

// 解除映射
unix.Munmap(data)

目录操作

1. 创建目录

err := os.Mkdir("mydir", 0755)

// 递归创建多级目录
err := os.MkdirAll("path/to/dir", 0755)

2. 读取目录

entries, err := os.ReadDir(".")
for _, entry := range entries {
    fmt.Println(entry.Name(), entry.IsDir())
}

// 更高效的方式
file, _ := os.Open(".")
defer file.Close()
names, _ := file.Readdirnames(0) // 0表示读取所有

3. 遍历目录树

err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
    if err != nil {
        return err
    }
    fmt.Println(path, info.Size())
    return nil
})

临时文件与目录

// 创建临时文件
tempFile, err := os.CreateTemp("", "example.*.txt")

// 创建临时目录
tempDir, err := os.MkdirTemp("", "example")
defer os.RemoveAll(tempDir) // 清理

最佳实践

  1. 总是检查错误:Go中的文件操作几乎都会返回错误,必须处理
  2. 使用defer关闭文件:确保资源被正确释放
  3. 考虑使用ioutil包:对于简单操作,os.ReadFileos.WriteFile更方便
  4. 大文件处理:对于大文件,使用流式处理而非一次性读取
  5. 并发安全:多goroutine访问同一文件时,考虑使用sync.Mutex或文件锁

性能考虑

  1. 使用bufio缓冲读写可以提高小文件操作的性能
  2. 对于频繁读写,考虑使用内存映射文件
  3. 批量操作比多次小操作更高效

希望这些信息对您在Linux环境下使用Golang进行文件操作有所帮助!