Go by Example: Temporary Files and Directories

A lo largo de la ejecución de un programa, a menudo queremos crear datos que no son necesarios después de que el programa se cierra. Los archivos y directorios temporales son útiles para este propósito ya que no contaminan el sistema de archivos con el tiempo.

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

La forma más fácil de crear un archivo temporal es llamando a os.CreateTemp. Esto crea un archivo y lo abre para lectura y escritura. Proporcionamos "" como primer argumento, así que os.CreateTemp creará el archivo en la ubicación predeterminada para nuestro sistema operativo.

    f, err := os.CreateTemp("", "sample")
    check(err)

Muestra el nombre del archivo temporal. En sistemas operativos basados en Unix, el directorio probablemente será /tmp. El nombre del archivo comienza con el prefijo dado como el segundo argumento a os.CreateTemp y el resto se elige automáticamente para asegurar que llamadas concurrentes siempre creen nombres de archivo diferentes.

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

Limpia el archivo después de que hayamos terminado. Es probable que el sistema operativo limpie los archivos temporales por sí mismo después de algún tiempo, pero es una buena práctica hacer esto explícitamente.

    defer os.Remove(f.Name())

Podemos escribir algunos datos en el archivo.

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

Si tenemos la intención de escribir muchos archivos temporales, podríamos preferir crear un directorio temporal. Los argumentos de os.MkdirTemp son los mismos que los de CreateTemp, pero devuelve un nombre de directorio en lugar de un archivo abierto.

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

Ahora podemos sintetizar nombres de archivos temporales prefijándolos con nuestro directorio temporal.

    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

Siguiente ejemplo: Embed Directive.