// Go has several useful functions for working with // *directories* in the file system. package main import ( "fmt" "io/ioutil" "os" "path/filepath" ) func check(e error) { if e != nil { panic(e) } } func main() { // Create a new sub-directory in the current working // directory. err := os.Mkdir("subdir", 0755) check(err) // When creating temporary directories, it's good // practice to `defer` their removal. `os.RemoveAll` // will delete a whole directory tree (similarly to // `rm -rf`). defer os.RemoveAll("subdir") // Helper function to create a new empty file. createEmptyFile := func(name string) { d := []byte("") check(ioutil.WriteFile(name, d, 0644)) } createEmptyFile("subdir/file1") // We can create a hierarchy of directories, including // parents with `MkdirAll`. This is similar to the // command-line `mkdir -p`. err = os.MkdirAll("subdir/parent/child", 0755) check(err) createEmptyFile("subdir/parent/file2") createEmptyFile("subdir/parent/file3") createEmptyFile("subdir/parent/child/file4") // `ReadDir` lists directory contents, returning a // slice of `os.FileInfo` objects. c, err := ioutil.ReadDir("subdir/parent") check(err) fmt.Println("Listing subdir/parent") for _, entry := range c { fmt.Println(" ", entry.Name(), entry.IsDir()) } // `Chdir` lets us change the current working directory, // similarly to `cd`. err = os.Chdir("subdir/parent/child") check(err) // Now we'll see the contents of `subdir/parent/child` // when listing the *current* directory. c, err = ioutil.ReadDir(".") check(err) fmt.Println("Listing subdir/parent/child") for _, entry := range c { fmt.Println(" ", entry.Name(), entry.IsDir()) } // `cd` back to where we started. err = os.Chdir("../../..") check(err) // We can also visit a directory *recursively*, // including all its sub-directories. `Walk` accepts // a callback function to handle every file or // directory visited. fmt.Println("Visiting subdir") err = filepath.Walk("subdir", visit) } // `visit` is called for every file or directory found // recursively by `filepath.Walk`. func visit(p string, info os.FileInfo, err error) error { if err != nil { return err } fmt.Println(" ", p, info.IsDir()) return nil }