📁 List files in a directory in Go

introduction file

The Go standard library has many functions that allow listing files in a folder. You can list only top-level content of a folder or go through all files and directories recursively in a nested directory structure, as well as list files matching a specific pattern.

In all examples we use a folder tree:

testFolder
├── file1.go
├── file2.txt
└── folder1
    └── fileInFolder1.txt

List files in a directory by using ioutil.ReadDir

Use ioutil.ReadDir when you want to retrieve files at the top-level of the directory tree.

package main

import (
    "fmt"
    "io/ioutil"
    "log"
)

func main() {
    files, err := ioutil.ReadDir("testFolder")
    if err != nil {
        log.Fatal(err)
    }

    for _, f := range files {
        fmt.Println(f.Name())
    }
}

Output:

file1.go
file2.txt
folder1

List files in a directory by using os.File.Readdir

The function os.File.Readdir works in the same way as ioutil.ReadDir, but it does not sort the result list by name.

package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    dir, err := os.Open("testFolder")
    if err != nil {
        log.Fatal(err)
    }

    files, err := dir.Readdir(-1)
    if err != nil {
        log.Fatal(err)
    }

    for _, f := range files {
        fmt.Println(f.Name())
    }
}

Output:

file2.txt
file1.txt
folder1

List files recursively by using filepath.Walk

Go provides a convenient function filepath.Walk(root string, fn WalkFunc) error to list files recursively. It starts at the root folder and calls fn WalkFunc function for each file and directory in the tree, in lexical order.

package main

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

func main() {
    err := filepath.Walk("testFolder",
        func(path string, _ os.FileInfo, err error) error {
            if err != nil {
                return err
            }
            fmt.Println(path)
            return nil
        })
    if err != nil {
        log.Fatal(err)
    }
}

Output:

testFolder
testFolder/file1.go
testFolder/file2.txt
testFolder/folder1
testFolder/folder1/fileInFolder1.txt

List files that match given pattern by using filepath.Glob

If you are interested only in files that match a given pattern, you can use filepath.Glob, for example, to list all files with .go extension 🙂. Pattern syntax can be found here.

package main

import (
    "fmt"
    "log"
    "path/filepath"
)

func main() {
    files, err := filepath.Glob("testFolder/*.go")
    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {
        fmt.Println(file)
    }
}

Output:

testFolder/file1.go

📁 Create a directory in Go

Learn how to create a single or a hierarchy of directories
introduction file

📎 Convert JSON to CSV in Go

Learn how to transform JSON file to CSV
introduction file json csv

⌛ Temporary file in Go - how to create?

Learn how to create and use a temporary file or folder
introduction file