Temporary Files and Directories

Временные файлы и директории (Temporary Files and Directories)|Temporary Files and Directories #

// Во время выполнения программы мы часто хотим создавать
// данные, которые не нужны после выхода из программы.
// *Временные файлы и каталоги* полезны для этой цели,
// поскольку они не загрязняют файловую систему с
// течением времени.

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")
	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