Temporary Files and Directories

Temporary Files and Directories #

// Muitas vezes, ao longo da execução de um programa, é preciso
// criar dados que não são necessários após seu encerramento.
// *Arquivos e diretórios temporários* são úteis para esta
// finalidade, pois não poluem o sistema de arquivos
// permanentemente.
package main

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

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

func main() {

	// A maneira mais fácil de criar um arquivo temporário é
	// com `os.CreateTemp`. eta função cria um arquivo e
	// abre para leitura e escrita. Ao fornecer `""` como o
	// primeiro argumento, a função irá criar o arquivo no
	// local padrão do sistema operacional.
	f, err := os.CreateTemp("", "sample")
	check(err)

	// Este trecho exibe o nome do arquivo temporário.
	// Em Sistemas Operacionais baseados em Unix, o
	// diretório em que o artquivo será criado, provavelmente,
	// é o `/tmp`. O nome do arquivo começa com o prefixo
	// passado como segundo argumento para `os.CreateTemp` e o
	// resto é escolhido automaticamente para garantir que
	// eventuais chamadas concorrentes sempre criarão nomes
	// de arquivos diferentes.
	fmt.Println("Temp file name:", f.Name())

	// Limpa o arquivo depois de finalizada a execução.
	// É provável que o Sistema Operacional tenha uma
	// rotina para limpar arquivos temporários
	// esporadicamente, mas é uma boa prática fazer isso
	// explicitamente ao final do código.
	defer os.Remove(f.Name())

	// É possível escrever dados no arquivo.
	_, err = f.Write([]byte{1, 2, 3, 4})
	check(err)

	// Se a intenção for escrever muitos arquivos
	// temporários, é preferível criar um diretório
	// temporário. A função `os.MkdirTemp` recebe os
	// mesmos argumentos que a `CreateTemp`, mas
	// retorna um nome de diretório, ao invés de
	// um arquivo aberto.
	dname, err := os.MkdirTemp("", "sampledir")
	check(err)
	fmt.Println("Temp dir name:", dname)

	defer os.RemoveAll(dname)

	// Agora é possível sintetizar os nomes de arquivos
	// temporários ao incluir como prefixo o diretório
	// temporário.
	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