Go by Example: Temporary Files and Directories

Trong suốt quá trình thực thi chương trình, ta thường muốn tạo dữ liệu tạm mà không cần thiết sau khi chương trình kết thúc. Tập tin và thư mục tạm thời rất hữu ích cho mục đích này vì về lâu dài chúng không khiến cho hệ thống tập tin chứa nhiều tập tin rác.

package main
import (
    "fmt"
    "os"
    "path/filepath"
)
func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {

Cách dễ nhất để tạo một tập tin tạm thời là bằng cách gọi os.CreateTemp. Nó tạo một tập tin mở nó để đọc và ghi. Chúng ta dùng "" làm tham số đầu tiên, vì vậy os.CreateTemp sẽ tạo tập tin trong vị trí mặc định của hệ điều hành.

    f, err := os.CreateTemp("", "sample")
    check(err)

Hiển thị tên của tập tin tạm thời. Trên các hệ điều hành dựa trên Unix, thư mục có thể là /tmp. Tên tập tin bắt đầu bằng tiền tố được truyền vào làm tham số thứ hai của os.CreateTemp và các tham số còn lại được chọn tự động để đảm bảo rằng việc thực thi đồng thời sẽ luôn tạo ra các tên tập tin khác nhau.

    fmt.Println("Temp file name:", f.Name())

Sau khi chúng ta hoàn thành, tập tin tạm thời sẽ được xóa. Hệ điều hành có thể sẽ tự động xóa các tập tin tạm thời sau một khoảng thời gian nhất định, nhưng tốt hơn là chúng ta nên làm điều này một cách tường minh.

    defer os.Remove(f.Name())

Ta có thể ghi một số dữ liệu vào tập tin.

    _, err = f.Write([]byte{1, 2, 3, 4})
    check(err)

Nếu chúng ta có ý định ghi nhiều tập tin tạm thời, ta nên ưu tiên tạo một thư mục tạm thời. Các tham số của os.MkdirTemp cũng tương tự như os.CreateTemp, nhưng nó trả về một tên thư mục thay vì một tập tin đang mở.

    dname, err := os.MkdirTemp("", "sampledir")
    check(err)
    fmt.Println("Temp dir name:", dname)
    defer os.RemoveAll(dname)

Giờ thì ta có thể tạo tên tập tin tạm thời bằng cách thêm tiền tố vào tên thư mục tạm thời.

    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

Ví dụ tiếp theo: Embed Directive.