在线文档  >   Golang练习   >   临时文件和目录

在程序运行时,我们经常希望创建一些程序退出后不再需要的数据。
临时文件和目录 在这种情况下非常有用,因为它们不会污染文件系统。

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {

    // 创建临时文件最简单的方法是调用 `os.CreateTemp`。
    // 它会创建一个文件并打开它以进行读写操作。
    // 我们将 `""` 作为第一个参数提供,因此 `os.CreateTemp` 
    // 将在我们的操作系统的默认位置创建该文件。
    f, err := os.CreateTemp("", "sample")
    check(err)

    // 显示临时文件的名称。在基于 Unix 的操作系统上,该目录可能是 `/tmp`。
    // 文件名以传递给 `os.CreateTemp` 的第二个参数作为前缀开始,
    // 其余部分会自动选择以确保并发调用总是创建不同的文件名。
    fmt.Println("Temp file name:", f.Name())

    // 当我们完成后清理文件,尽管操作系统很可能会在一段时间后自动清理临时文件,
    // 但显式清理是个好习惯。
    defer os.Remove(f.Name())

    //我们可以向该文件写入一些数据。
    _, err = f.Write([]byte{1, 2, 3, 4})
    check(err)

    //如果我们打算生成许多临时文件,则可能更喜欢创建一个临时*目录*。
    // `os.MkdirTemp` 的参数与 `CreateTemp` 相同,
    // 但它返回一个目录名称而不是打开文件。
    dname, err := os.MkdirTemp("", "sampledir")
    check(err)
    fmt.Println("Temp dir name:", dname)

    defer os.RemoveAll(dname)

    // 现在,我们可以通过将它们的名称以临时目录为前缀来合成临时文件名。
    fname := filepath.Join(dname, "file1")
    err = os.WriteFile(fname, []byte{1, 2}, 0666)
    check(err)
}

运行结果如下:

$ go run temporary-files-and-directories.go
Temp file name: /tmp/sample610887201
Temp dir name: /tmp/sampledir898854668