TTuck

Throughout program execution, we often want to create data that isn't needed after the program exits. Temporary files and directories are useful for this purpose since they don't pollute the file system over time.

package main

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

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

func main() {

The easiest way to create a temporary file is by calling os.CreateTemp. It creates a file and opens it for reading and writing. We provide "" as the first argument, so os.CreateTemp will create the file in the default location for our OS.

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

Display the name of the temporary file. On Unix-based OSes the directory will likely be /tmp. The file name starts with the prefix given as the second argument to os.CreateTemp and the rest is chosen automatically to ensure that concurrent calls will always create different file names.

	name := filepath.Base(f.Name())
	fmt.Println("Temp file name starts with sample:", strings.HasPrefix(name, "sample"))

Clean up the file after we're done. The OS is likely to clean up temporary files by itself after some time, but it's good practice to do this explicitly.

	defer os.Remove(f.Name())

We can write some data to the file.

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

If we intend to create many temporary files, we may prefer to create a temporary directory. os.MkdirTemp's arguments are the same as CreateTemp's, but it returns a directory name rather than an open file.

	dname, err := os.MkdirTemp("", "sampledir")
	check(err)
	fmt.Println("Temp dir is a directory:", isDir(dname))

	defer os.RemoveAll(dname)

Now we can synthesize temporary file names by prefixing them with our temporary directory.

	fname := filepath.Join(dname, "file1")
	err = os.WriteFile(fname, []byte{1, 2}, 0666)
	check(err)

	data, err := os.ReadFile(fname)
	check(err)
	fmt.Println("read back", data)

os.TempDir returns the default directory for temporary files.

	fmt.Println("TempDir is set:", os.TempDir() != "")
}

func isDir(path string) bool {
	info, err := os.Stat(path)
	return err == nil && info.IsDir()
}
$ go run ./75_temporary_files_and_directories
Temp file name starts with sample: true
Temp dir is a directory: true
read back [1 2]
TempDir is set: true