Go با مثال: فایل‌ها و پوشه‌های موقت

در طول اجرای برنامه، اغلب می‌خواهیم داده‌هایی بسازیم که پس از خروج برنامه دیگر به آن‌ها نیازی نیست. فایل‌ها و پوشه‌های موقت برای این منظور مفیدند، چون به مرور زمان سیستم فایل را شلوغ نمی‌کنند.

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)

نام فایل موقت را نمایش می‌دهیم. در سیستم‌عامل‌های مبتنی بر یونیکس، پوشه احتمالاً /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

مثال بعدی: .