Temporary Files and Directories

Тимчасові Файли та Директорії|Temporary Files and Directories #

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

package main

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

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

func main() {

	// Найпростіший спосіб створити тимчасовий файл
	// - використати `ioutil.TempFile`.
	// Він створює файл *та* відкриває його для читання
	// і запису. Як перший аргумент ми передаємо `""`,
	// для того щоб `ioutil.TempFile` створив файл,
	// розташування якого буде за замовчуванням для нашої ОС.
	f, err := os.CreateTemp("", "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 := 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}, 0o666)
	check(err)
}
$ go run temporary-files-and-directories.go
Temp file name: /tmp/sample610887201
Temp dir name: /tmp/sampledir898854668