Функция fs.WalkDir
Функция fs.WalkDir используется для рекурсивного обхода всех файлов и директорий. В первый параметр передается файловая система (обычно os.DirFS), во второй — корневой путь для обхода, а в третий — функция обратного вызова, которая будет вызываться для каждого элемента. Функция обратного вызова принимает путь, fs.DirEntry и ошибку, что делает обход более эффективным по сравнению с filepath.Walk.
Синтаксис
fs.WalkDir(fsys fs.FS, root string, fn fs.WalkDirFunc) error
Пример
Давайте выведем все пути в текущей директории:
package 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)
}
}
Пример
Давайте соберем имена всех файлов в слайс:
package 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)
}
Результат выполнения кода:
[file1.txt file2.go dir/file3.md]
Пример
Давайте рекурсивно подсчитаем общее количество файлов и папок в структуре, игнорируя определенные директории:
package 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)
}
Результат выполнения кода:
"Total entries: 42"
Смотрите также
-
функцию
filepath.WalkDir,
которая обходит файлы с fs.DirEntry -
функцию
os.ReadDir,
которая читает содержимое директории -
функцию
filepath.Walk,
более старая версия обхода с fs.FileInfo -
функцию
fs.SkipDir,
которая позволяет пропустить обход директории