7. Go 文件操作

文件操作基础

打开文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 打开文件
file, err := os.Open("example.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

// 创建文件
file, err := os.Create("newfile.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

读取文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 读取整个文件
data, err := os.ReadFile("example.txt")
if err != nil {
    log.Fatal(err)
}

// 按行读取
file, err := os.Open("example.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    line := scanner.Text()
    fmt.Println(line)
}

写入文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 写入字符串
err := os.WriteFile("output.txt", []byte("Hello, World!"), 0644)
if err != nil {
    log.Fatal(err)
}

// 追加写入
file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
    log.Fatal(err)
}
defer file.Close()

_, err = file.WriteString("追加的内容")
if err != nil {
    log.Fatal(err)
}

目录操作

创建目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 创建单个目录
err := os.Mkdir("newdir", 0755)
if err != nil {
    log.Fatal(err)
}

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

遍历目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 读取目录内容
entries, err := os.ReadDir(".")
if err != nil {
    log.Fatal(err)
}

for _, entry := range entries {
    fmt.Println(entry.Name())
}

// 递归遍历目录
func walkDir(dir string) {
    entries, err := os.ReadDir(dir)
    if err != nil {
        log.Fatal(err)
    }

    for _, entry := range entries {
        path := filepath.Join(dir, entry.Name())
        if entry.IsDir() {
            walkDir(path)
        } else {
            fmt.Println(path)
        }
    }
}

文件信息

获取文件信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 获取文件信息
fileInfo, err := os.Stat("example.txt")
if err != nil {
    log.Fatal(err)
}

fmt.Printf("文件名: %s\n", fileInfo.Name())
fmt.Printf("大小: %d bytes\n", fileInfo.Size())
fmt.Printf("修改时间: %v\n", fileInfo.ModTime())
fmt.Printf("权限: %v\n", fileInfo.Mode())

检查文件状态

1
2
3
4
5
6
7
8
9
// 检查文件是否存在
if _, err := os.Stat("example.txt"); os.IsNotExist(err) {
    fmt.Println("文件不存在")
}

// 检查是否是目录
if fileInfo.IsDir() {
    fmt.Println("这是一个目录")
}

临时文件

创建临时文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 创建临时文件
tmpFile, err := os.CreateTemp("", "example-*.txt")
if err != nil {
    log.Fatal(err)
}
defer os.Remove(tmpFile.Name())

// 写入临时文件
content := []byte("临时文件内容")
if _, err := tmpFile.Write(content); err != nil {
    log.Fatal(err)
}

文件路径操作

路径处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 路径拼接
path := filepath.Join("dir", "subdir", "file.txt")

// 获取绝对路径
absPath, err := filepath.Abs("relative/path")
if err != nil {
    log.Fatal(err)
}

// 获取文件扩展名
ext := filepath.Ext("file.txt")

// 获取文件名(不含扩展名)
name := strings.TrimSuffix("file.txt", filepath.Ext("file.txt"))

参考资源

57.12k 字
43篇文章