Функция fs.WalkDir

Функция fs.WalkDir используется для рекурсивного обхода всех файлов и директорий. В первый параметр передается файловая система (обычно os.DirFS), во второй — корневой путь для обхода, а в третий — функция обратного вызова, которая будет вызываться для каждого элемента. Функция обратного вызова принимает путь, fs.DirEntry и ошибку, что делает обход более эффективным по сравнению с filepath.Walk.

Синтаксис

gofs.WalkDir(fsys fs.FS, root string, fn fs.WalkDirFunc) error

Пример

Давайте выведем все пути в текущей директории:

gopackage main

import (
  "fmt"
  "fs"
  "os"
)

func main() {
  fsys := os.DirFS(".")
  err := fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
      return err
    }
    fmt.Println(path)
    return nil
  })
  if err != nil {
    fmt.Println("Error:", err)
  }
}

Пример

Давайте соберем имена всех файлов в слайс:

gopackage main

import (
  "fmt"
  "fs"
  "os"
)

func main() {
  var files []string
  fsys := os.DirFS(".")
  fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
      return err
    }
    if !d.IsDir() {
      files = append(files, path)
    }
    return nil
  })
  fmt.Println(files)
}

Результат выполнения кода:

go[file1.txt file2.go dir/file3.md]

Пример

Давайте рекурсивно подсчитаем общее количество файлов и папок в структуре, игнорируя определенные директории:

gopackage main

import (
  "fmt"
  "fs"
  "os"
)

func main() {
  count := 0
  fsys := os.DirFS(".")
  fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
      return err
    }
    if d.IsDir() && path == "node_modules" {
      return fs.SkipDir
    }
    count++
    return nil
  })
  fmt.Println("Total entries:", count)
}

Результат выполнения кода:

go"Total entries: 42"

Смотрите также

  • функцию filepath.WalkDir,
    которая обходит файлы с fs.DirEntry
  • функцию os.ReadDir,
    которая читает содержимое директории
  • функцию filepath.Walk,
    более старая версия обхода с fs.FileInfo
  • функцию fs.SkipDir,
    которая позволяет пропустить обход директории