Функция filepath.WalkDir

Функция filepath.WalkDir рекурсивно обходит директорию, передавая каждый найденный файл или папку в функцию обратного вызова. В первый параметр мы передаем путь к корневой директории, во второй параметр мы передаем функцию обработчик, которая будет вызываться для каждого элемента.

Функция обработчик принимает три параметра: путь к текущему элементу (string), информацию о элементе (fs.DirEntry) и ошибку (error). Если при обходе возникает ошибка, она передается в обработчик, который может решить, как с ней поступить.

Синтаксис

gofilepath.WalkDir(root string, fn fs.WalkDirFunc) error

Пример

Давайте выполним простой обход директории и выведем пути всех файлов и папок:

gopackage main

import (
  "fmt"
  "io/fs"
  "path/filepath"
)

func main() {
  err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
      return err
    }
    fmt.Println(path)
    return nil
  })
  if err != nil {
    fmt.Printf("Error walking directory: %v\n", err)
  }
}

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

go.
main.go
docs
docs/readme.txt
docs/images

Пример

Давайте выполним обход директории, но исключим из обхода папку с именем "docs":

gopackage main

import (
  "fmt"
  "io/fs"
  "path/filepath"
)

func main() {
  err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
      return err
    }
    if d.IsDir() && d.Name() == "docs" {
      fmt.Printf("Skipping directory: %s\n", path)
      return filepath.SkipDir
    }
    fmt.Println(path)
    return nil
  })
  if err != nil {
    fmt.Printf("Error walking directory: %v\n", err)
  }
}

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

go.
main.go
Skipping directory: docs

Пример

Давайте выполним обход директории и выведем только файлы с расширением ".txt":

gopackage main

import (
  "fmt"
  "io/fs"
  "path/filepath"
  "strings"
)

func main() {
  err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
    if err != nil {
      return err
    }
    if !d.IsDir() && strings.HasSuffix(path, ".txt") {
      fmt.Println(path)
    }
    return nil
  })
  if err != nil {
    fmt.Printf("Error walking directory: %v\n", err)
  }
}

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

godocs/readme.txt
notes.txt
backup/info.txt

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

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