Функция filepath.WalkDir
Функция filepath.WalkDir рекурсивно обходит директорию,
передавая каждый найденный файл или папку в функцию обратного
вызова. В первый параметр мы передаем путь к корневой директории,
во второй параметр мы передаем функцию обработчик, которая будет
вызываться для каждого элемента.
Функция обработчик принимает три параметра: путь к текущему
элементу (string), информацию о элементе
(fs.DirEntry) и ошибку (error). Если при обходе
возникает ошибка, она передается в обработчик, который может
решить, как с ней поступить.
Синтаксис
filepath.WalkDir(root string, fn fs.WalkDirFunc) error
Пример
Давайте выполним простой обход директории и выведем пути всех файлов и папок:
package 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)
}
}
Результат выполнения кода:
.
main.go
docs
docs/readme.txt
docs/images
Пример
Давайте выполним обход директории, но исключим из обхода папку с именем "docs":
package 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)
}
}
Результат выполнения кода:
.
main.go
Skipping directory: docs
Пример
Давайте выполним обход директории и выведем только файлы с расширением ".txt":
package 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)
}
}
Результат выполнения кода:
docs/readme.txt
notes.txt
backup/info.txt
Смотрите также
-
функцию
filepath.Walk,
которая выполняет обход директорий с использованием fs.FileInfo -
функцию
fs.WalkDir,
которая выполняет обход файловой системы через интерфейс fs.FS -
функцию
os.ReadDir,
которая читает содержимое одной директории в виде среза fs.DirEntry -
функцию
filepath.Glob,
которая ищет файлы по шаблону без рекурсивного обхода