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
folder1List 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
folder1List 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.txtList 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