Go Em Exemplos: 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

Próximo exemplo: Embed Directive.