Go за Прикладом: Тимчасові Файли та Директорії

Під час виконання програми ми часто хочемо створити дані, які після закінчення програми можуть бути непотрібні. Тимчасові файли та каталоги гарно підходять для цієї задачі, оскільки вони не забруднюють файлову систему.

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

Найпростіший спосіб створити тимчасовий файл - використати ioutil.TempFile. Він створює файл та відкриває його для читання і запису. Як перший аргумент ми передаємо "", для того щоб ioutil.TempFile створив файл, розташування якого буде за замовчуванням для нашої ОС.

    f, err := ioutil.TempFile("", "sample")
    check(err)

Відобразить ім’я тимчасового файлу. У UNIX-подібних системах, каталог, швидше за все, буде /tmp. Ім’я файлу починається з префіксу, який ми вказали у другому аргументі ioutil.TempFile, а решта генерується автоматично, щоб гарантувати, що паралельні виклики завжди створюватимуть різні імена файлів.

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

Видалимо файл після того, як ми закінчимо. ОС, швидше за все, очищає тимчасові файли самостійно через деякий час, але краще зробити це явно.

    defer os.Remove(f.Name())

Ми можемо записати деякі данні в файл.

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

Якщо ми маємо намір створювати багато тимчасових файлів, ми можемо вважати що краще створити тимчасовий каталог. Аргументи ioutil.TempDir такі ж, як і уTempFile, але результатом буде ім’я каталогу.

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

Тепер ми можемо створити ім’я файлу додавши префікс до тимчасового каталога.

    fname := filepath.Join(dname, "file1")
    err = ioutil.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

Наступний приклад: Тестування.