linux

Go语言在Linux中的文件操作指南

小樊
45
2025-08-03 08:01:13
栏目: 编程语言

在Linux系统中使用Go语言进行文件操作是一个常见的任务,Go的标准库提供了丰富的功能来处理文件。以下是一个详细的指南,涵盖了从基本文件操作到高级操作的各个方面。

基本文件操作

打开和关闭文件

使用os.Open打开文件,使用os.OpenFile以读写模式打开文件,如果文件不存在则创建它。使用defer确保文件最终被关闭。

package main

import (
    "log"
    "os"
)

func main() {
    // 打开文件(只读模式)
    file, err := os.Open("test.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // 以读写模式打开文件,如果不存在则创建,权限设置为644
    file, err = os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
}

读取文件

// 读取整个文件
data, err := os.ReadFile("test.txt")
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data))

// 逐行读取
scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
    log.Fatal(err)
}

// 缓冲读取
reader := bufio.NewReader(file)
for {
    line, err := reader.ReadString('\n')
    if err != nil {
        if err == io.EOF {
            break
        }
        log.Fatal(err)
    }
    fmt.Print(line)
}

写入文件

// 写入整个文件
content := []byte("Hello, Linux!")
err := os.WriteFile("output.txt", content, 0644)
if err != nil {
    log.Fatal(err)
}

// 缓冲写入
writer := bufio.NewWriter(file)
_, err = writer.WriteString("Hello, Linux!\n")
if err != nil {
    log.Fatal(err)
}
writer.Flush()

高级文件操作

文件信息与权限

使用os.Stat获取文件信息,包括文件名、大小、权限、最后修改时间等。使用os.Chmod修改文件权限,使用os.Chown修改文件所有者。

fileInfo, err := os.Stat("test.txt")
if err != nil {
    log.Fatal(err)
}
fmt.Println("File name:", fileInfo.Name())
fmt.Println("Size in bytes:", fileInfo.Size())
fmt.Println("Permissions:", fileInfo.Mode())
fmt.Println("Last modified:", fileInfo.ModTime())
fmt.Println("Is directory:", fileInfo.IsDir())

// 修改文件权限
err = os.Chmod("test.txt", 0755)
if err != nil {
    log.Fatal(err)
}

// 修改文件所有者
err = os.Chown("test.txt", os.Getuid(), os.Getgid())
if err != nil {
    log.Fatal(err)
}

目录操作

// 创建目录
err := os.Mkdir("mydir", 0755)
if err != nil {
    log.Fatal(err)
}

// 创建多级目录
err = os.MkdirAll("path/to/dir", 0755)
if err != nil {
    log.Fatal(err)
}

// 读取目录内容
files, err := os.ReadDir(".")
if err != nil {
    log.Fatal(err)
}
for _, file := range files {
    fmt.Println(file.Name())
}

// 删除目录
err = os.Remove("mydir")
if err != nil {
    log.Fatal(err)
}

// 递归删除目录
err = os.RemoveAll("path/to/dir")
if err != nil {
    log.Fatal(err)
}

文件移动和重命名

使用os.Rename重命名文件或移动文件。

// 重命名文件
err := os.Rename("oldname.txt", "newname.txt")
if err != nil {
    log.Fatal(err)
}

// 移动文件(在同一文件系统中)
err = os.Rename("/tmp/file.txt", "/home/user/file.txt")
if err != nil {
    log.Fatal(err)
}

符号链接操作

使用os.Symlink创建符号链接,使用os.Readlink读取符号链接目标。

// 创建符号链接
err := os.Symlink("original.txt", "link.txt")
if err != nil {
    log.Fatal(err)
}

// 读取符号链接目标
target, err := os.Readlink("link.txt")
if err != nil {
    log.Fatal(err)
}
fmt.Println("Link target:", target)

文件锁定

使用syscall.Flock实现文件锁定。

import "syscall"

func lockFile(f *os.File) error {
    err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
    if err != nil {
        return fmt.Errorf("failed to lock file: %v", err)
    }
    return nil
}

func unlockFile(f *os.File) error {
    err := syscall.Flock(int(f.Fd()), syscall.LOCK_UN)
    if err != nil {
        return fmt.Errorf("failed to unlock file: %v", err)
    }
    return nil
}

最佳实践

通过掌握这些文件操作技术,你可以在Linux环境下高效地使用Go语言处理各种文件相关的任务。

0
看了该问题的人还看了