os.ReadDir lists entries inside a directory.

directory entries Directory entries describe files or folders by name and type without reading file contents.

Directory Entries

extraName
directory_entries.go
Replay: real traced execution (multi-file project)
package main

import (
	"fmt"
	"os"
	"strings"
)

func main() {
	var extraName = "notes.txt"
	dirName := "go09_entries"
	names := []string{"alpha.txt", extraName}

	err := os.MkdirAll(dirName, 0755)
	if err != nil {
		fmt.Println("createdDir=", false)
		return
	}
	defer os.RemoveAll(dirName)

	for _, name := range names {
		path := dirName + "/" + name
		os.WriteFile(path, []byte(name), 0644)
	}

	entries, err := os.ReadDir(dirName)
	if err != nil {
		fmt.Println("listed=", false)
		return
	}

	entryNames := make([]string, 0, len(entries))
	for _, entry := range entries {
		entryNames = append(entryNames, entry.Name())
	}
	joined := strings.Join(entryNames, "/")

	fmt.Println("dir=", dirName)
	fmt.Println("count=", len(entryNames))
	fmt.Println("entries=", joined)
}
package main

import (
	"fmt"
	"os"
	"strings"
)

func main() {
	var extraName = "tasks.txt"
	dirName := "go09_entries"
	names := []string{"alpha.txt", extraName}

	err := os.MkdirAll(dirName, 0755)
	if err != nil {
		fmt.Println("createdDir=", false)
		return
	}
	defer os.RemoveAll(dirName)

	for _, name := range names {
		path := dirName + "/" + name
		os.WriteFile(path, []byte(name), 0644)
	}

	entries, err := os.ReadDir(dirName)
	if err != nil {
		fmt.Println("listed=", false)
		return
	}

	entryNames := make([]string, 0, len(entries))
	for _, entry := range entries {
		entryNames = append(entryNames, entry.Name())
	}
	joined := strings.Join(entryNames, "/")

	fmt.Println("dir=", dirName)
	fmt.Println("count=", len(entryNames))
	fmt.Println("entries=", joined)
}
package main

import (
	"fmt"
	"os"
	"strings"
)

func main() {
	var extraName = "draft.txt"
	dirName := "go09_entries"
	names := []string{"alpha.txt", extraName}

	err := os.MkdirAll(dirName, 0755)
	if err != nil {
		fmt.Println("createdDir=", false)
		return
	}
	defer os.RemoveAll(dirName)

	for _, name := range names {
		path := dirName + "/" + name
		os.WriteFile(path, []byte(name), 0644)
	}

	entries, err := os.ReadDir(dirName)
	if err != nil {
		fmt.Println("listed=", false)
		return
	}

	entryNames := make([]string, 0, len(entries))
	for _, entry := range entries {
		entryNames = append(entryNames, entry.Name())
	}
	joined := strings.Join(entryNames, "/")

	fmt.Println("dir=", dirName)
	fmt.Println("count=", len(entryNames))
	fmt.Println("entries=", joined)
}
  1. extraName ← "notes.txt", dirName ← "go09_entries", names ← []string{"alpha.txt", "notes.txt"}

    9func main() {10  var extraName→ "notes.txt" = "notes.txt" //@extraName="tasks.txt", "draft.txt"11  dirName→ "go09_entries" := "go09_entries"12  names→ []string{"alpha.txt", "notes.txt"} := []string{"alpha.txt", extraName"notes.txt"}1314  err→ <nil> := os.MkdirAll(dirName"go09_entries", 0755)15  if err != nil {16    fmt.Println("createdDir=", false)17    return18  }19  defer os.RemoveAll(dirName"go09_entries")
  2. for _, name := range names

    pass 1 of 2
    21for _, name"alpha.txt" := range names[]string{"alpha.txt", "notes.txt"} {22  path := dirName"go09_entries" + "/" + name"alpha.txt"23  os.WriteFile(path, []byte(name"alpha.txt"), 0644)24}
  3. for _, name := range names

    pass 2 of 2
    21for _, name"notes.txt" := range names[]string{"alpha.txt", "notes.txt"} {22  path := dirName"go09_entries" + "/" + name"notes.txt"23  os.WriteFile(path, []byte(name"notes.txt"), 0644)24}
  4. entries ← []fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}

    26entries→ []fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}, err→ <nil> := os.ReadDir(dirName"go09_entries")27if err != nil {28  fmt.Println("listed=", false)29  return30}3132entryNames→ []string{} := make([]string, 0, len(entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}))33for _, entry := range entries {
  5. entryNames ← []string{"alpha.txt"}

    pass 1 of 2
    32entryNames := make([]string, 0, len(entries))33for _, entry&os.unixDirent{parent:"go09_entries", name:"alpha.txt", typ:0x0, info:fs.FileInfo(nil)} := range entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)} {34  entryNames→ []string{"alpha.txt"} = append(entryNames, entry&os.unixDirent{parent:"go09_entries", name:"alpha.txt", typ:0x0, info:fs.FileInfo(nil)}.Name())35}
  6. entryNames ← []string{"alpha.txt", "notes.txt"}

    pass 2 of 2
    32entryNames := make([]string, 0, len(entries))33for _, entry&os.unixDirent{parent:"go09_entries", name:"notes.txt", typ:0x0, info:fs.FileInfo(nil)} := range entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)} {34  entryNames→ []string{"alpha.txt", "notes.txt"} = append(entryNames, entry&os.unixDirent{parent:"go09_entries", name:"notes.txt", typ:0x0, info:fs.FileInfo(nil)}.Name())35}
  7. joined ← "alpha.txt/notes.txt"

    35  }36  joined→ "alpha.txt/notes.txt" := strings.Join(entryNames[]string{"alpha.txt", "notes.txt"}, "/")3738  fmt.Println("dir=", dirName"go09_entries")39  fmt.Println("count=", len(entryNames[]string{"alpha.txt", "notes.txt"}))40  fmt.Println("entries=", joined"alpha.txt/notes.txt")41}
    outputdir= go09_entries
    count= 2
    entries= alpha.txt/notes.txt
  1. extraName ← "tasks.txt", dirName ← "go09_entries", names ← []string{"alpha.txt", "tasks.txt"}

    9func main() {10  var extraName→ "tasks.txt" = "tasks.txt"11  dirName→ "go09_entries" := "go09_entries"12  names→ []string{"alpha.txt", "tasks.txt"} := []string{"alpha.txt", extraName"tasks.txt"}1314  err→ <nil> := os.MkdirAll(dirName"go09_entries", 0755)15  if err != nil {16    fmt.Println("createdDir=", false)17    return18  }19  defer os.RemoveAll(dirName"go09_entries")
  2. for _, name := range names

    pass 1 of 2
    21for _, name"alpha.txt" := range names[]string{"alpha.txt", "tasks.txt"} {22  path := dirName"go09_entries" + "/" + name"alpha.txt"23  os.WriteFile(path, []byte(name"alpha.txt"), 0644)24}
  3. for _, name := range names

    pass 2 of 2
    21for _, name"tasks.txt" := range names[]string{"alpha.txt", "tasks.txt"} {22  path := dirName"go09_entries" + "/" + name"tasks.txt"23  os.WriteFile(path, []byte(name"tasks.txt"), 0644)24}
  4. entries ← []fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}

    26entries→ []fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}, err→ <nil> := os.ReadDir(dirName"go09_entries")27if err != nil {28  fmt.Println("listed=", false)29  return30}3132entryNames→ []string{} := make([]string, 0, len(entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}))33for _, entry := range entries {
  5. entryNames ← []string{"alpha.txt"}

    pass 1 of 2
    32entryNames := make([]string, 0, len(entries))33for _, entry&os.unixDirent{parent:"go09_entries", name:"alpha.txt", typ:0x0, info:fs.FileInfo(nil)} := range entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)} {34  entryNames→ []string{"alpha.txt"} = append(entryNames, entry&os.unixDirent{parent:"go09_entries", name:"alpha.txt", typ:0x0, info:fs.FileInfo(nil)}.Name())35}
  6. entryNames ← []string{"alpha.txt", "tasks.txt"}

    pass 2 of 2
    32entryNames := make([]string, 0, len(entries))33for _, entry&os.unixDirent{parent:"go09_entries", name:"tasks.txt", typ:0x0, info:fs.FileInfo(nil)} := range entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)} {34  entryNames→ []string{"alpha.txt", "tasks.txt"} = append(entryNames, entry&os.unixDirent{parent:"go09_entries", name:"tasks.txt", typ:0x0, info:fs.FileInfo(nil)}.Name())35}
  7. joined ← "alpha.txt/tasks.txt"

    35  }36  joined→ "alpha.txt/tasks.txt" := strings.Join(entryNames[]string{"alpha.txt", "tasks.txt"}, "/")3738  fmt.Println("dir=", dirName"go09_entries")39  fmt.Println("count=", len(entryNames[]string{"alpha.txt", "tasks.txt"}))40  fmt.Println("entries=", joined"alpha.txt/tasks.txt")41}
    outputdir= go09_entries
    count= 2
    entries= alpha.txt/tasks.txt
  1. extraName ← "draft.txt", dirName ← "go09_entries", names ← []string{"alpha.txt", "draft.txt"}

    9func main() {10  var extraName→ "draft.txt" = "draft.txt"11  dirName→ "go09_entries" := "go09_entries"12  names→ []string{"alpha.txt", "draft.txt"} := []string{"alpha.txt", extraName"draft.txt"}1314  err→ <nil> := os.MkdirAll(dirName"go09_entries", 0755)15  if err != nil {16    fmt.Println("createdDir=", false)17    return18  }19  defer os.RemoveAll(dirName"go09_entries")
  2. for _, name := range names

    pass 1 of 2
    21for _, name"alpha.txt" := range names[]string{"alpha.txt", "draft.txt"} {22  path := dirName"go09_entries" + "/" + name"alpha.txt"23  os.WriteFile(path, []byte(name"alpha.txt"), 0644)24}
  3. for _, name := range names

    pass 2 of 2
    21for _, name"draft.txt" := range names[]string{"alpha.txt", "draft.txt"} {22  path := dirName"go09_entries" + "/" + name"draft.txt"23  os.WriteFile(path, []byte(name"draft.txt"), 0644)24}
  4. entries ← []fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}

    26entries→ []fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}, err→ <nil> := os.ReadDir(dirName"go09_entries")27if err != nil {28  fmt.Println("listed=", false)29  return30}3132entryNames→ []string{} := make([]string, 0, len(entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)}))33for _, entry := range entries {
  5. entryNames ← []string{"alpha.txt"}

    pass 1 of 2
    32entryNames := make([]string, 0, len(entries))33for _, entry&os.unixDirent{parent:"go09_entries", name:"alpha.txt", typ:0x0, info:fs.FileInfo(nil)} := range entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)} {34  entryNames→ []string{"alpha.txt"} = append(entryNames, entry&os.unixDirent{parent:"go09_entries", name:"alpha.txt", typ:0x0, info:fs.FileInfo(nil)}.Name())35}
  6. entryNames ← []string{"alpha.txt", "draft.txt"}

    pass 2 of 2
    32entryNames := make([]string, 0, len(entries))33for _, entry&os.unixDirent{parent:"go09_entries", name:"draft.txt", typ:0x0, info:fs.FileInfo(nil)} := range entries[]fs.DirEntry{(*os.unixDirent)(⟨addr A⟩), (*os.unixDirent)(⟨addr B⟩)} {34  entryNames→ []string{"alpha.txt", "draft.txt"} = append(entryNames, entry&os.unixDirent{parent:"go09_entries", name:"draft.txt", typ:0x0, info:fs.FileInfo(nil)}.Name())35}
  7. joined ← "alpha.txt/draft.txt"

    35  }36  joined→ "alpha.txt/draft.txt" := strings.Join(entryNames[]string{"alpha.txt", "draft.txt"}, "/")3738  fmt.Println("dir=", dirName"go09_entries")39  fmt.Println("count=", len(entryNames[]string{"alpha.txt", "draft.txt"}))40  fmt.Println("entries=", joined"alpha.txt/draft.txt")41}
    outputdir= go09_entries
    count= 2
    entries= alpha.txt/draft.txt