Go by Example: File e Directory Temporanei

Durante l’esecuzione del programma, spesso vogliamo creare dati che non sono necessari dopo l’uscita del programma. File e directory temporanei sono utili per questo scopo poiché non inquinano il file system nel tempo.

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

Il modo più semplice per creare un file temporaneo è chiamare os.CreateTemp. Crea un file e lo apre per lettura e scrittura. Forniamo "" come primo argomento, così os.CreateTemp creerà il file nella posizione predefinita per il nostro OS.

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

Mostra il nome del file temporaneo. Sui sistemi operativi Unix la directory sarà probabilmente /tmp. Il nome del file inizia con il prefisso dato come secondo argomento a os.CreateTemp e il resto viene scelto automaticamente per assicurare che chiamate concorrenti creino sempre nomi di file diversi.

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

Puliamo il file dopo aver finito. Il sistema operativo probabilmente pulirà i file temporanei da solo dopo un po’ di tempo, ma è buona pratica farlo esplicitamente.

    defer os.Remove(f.Name())

Possiamo scrivere alcuni dati nel file.

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

Se intendiamo scrivere molti file temporanei, potremmo preferire creare una directory temporanea. Gli argomenti di os.MkdirTemp sono gli stessi di CreateTemp, ma restituisce un nome di directory piuttosto che un file aperto.

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

Ora possiamo sintetizzare nomi di file temporanei prefissandoli con la nostra directory temporanea.

    fname := filepath.Join(dname, "file1")
    err = os.WriteFile(fname, []byte{1, 2}, 0666)
    check(err)
}
$ go run file-e-directory-temporanei.go
Temp file name: /tmp/sample610887201
Temp dir name: /tmp/sampledir898854668

Prossimo esempio: .