РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
553 of 1593 menu

Функция filepath.Walk

Функция filepath.Walk рекурсивно обходит файловое дерево, начиная с указанного корневого пути. Она принимает два параметра: первый параметр — это путь к корневой директории для обхода, второй параметр — функция обратного вызова WalkFunc, которая вызывается для каждого файла или директории. Если функция обратного вызова возвращает ошибку, обход может быть прерван.

Синтаксис

filepath.Walk(rootPath, walkFunc)

Пример

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

package main import ( "fmt" "path/filepath" ) func main() { err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { if err != nil { return err } fmt.Println(path) return nil }) if err != nil { fmt.Println(err) } }

Результат выполнения кода (зависит от структуры директорий):

"." "./file1.txt" "./dir1" "./dir1/file2.txt"

Пример

Давайте обойдем директорию и соберем все пути файлов с расширением .go:

package main import ( "fmt" "path/filepath" "os" "strings" ) func main() { var goFiles []string err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() && strings.HasSuffix(info.Name(), ".go") { goFiles = append(goFiles, path) } return nil }) if err != nil { fmt.Println(err) } fmt.Println(goFiles) }

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

["./main.go" "./pkg/helper.go" "./internal/utils.go"]

Пример

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

package main import ( "fmt" "path/filepath" "os" ) func main() { target := "config.yaml" found := false err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() && info.Name() == target { found = true return filepath.SkipDir // останавливаем обход } return nil }) if err != nil { fmt.Println(err) } fmt.Println(found) }

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

true

Пример

Давайте обойдем директорию и вычислим общий размер всех файлов:

package main import ( "fmt" "path/filepath" "os" ) func main() { var totalSize int64 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { totalSize += info.Size() } return nil }) if err != nil { fmt.Println(err) } fmt.Println(totalSize) }

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

1234567

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

  • функцию filepath.WalkDir,
    которая является более эффективной альтернативой для обхода файловой системы
  • функцию filepath.Glob,
    которая ищет файлы по шаблону в директории
  • функцию os.ReadDir,
    которая читает содержимое директории без рекурсивного обхода
  • функцию filepath.Join,
    которая объединяет пути с правильным разделителем
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить