Интерфейс fs.DirEntry

Интерфейс fs.DirEntry представляет собой элемент директории (файл или папку), полученный при чтении содержимого каталога. Он используется в таких функциях как os.ReadDir и fs.ReadDir. Основное назначение этого интерфейса — предоставить быстрый доступ к основным свойствам записи без необходимости выполнять полноценный системный вызов Stat для каждого элемента. Интерфейс содержит методы: Name для получения имени, IsDir для проверки, является ли запись директорией, Type для получения типа файла в виде fs.FileMode, и Info для получения полной информации о записи в виде интерфейса fs.FileInfo.

Синтаксис

gotype DirEntry interface {
  Name() string
  IsDir() bool
  Type() FileMode
  Info() (FileInfo, error)
}

Для работы с интерфейсом обычно не требуется его реализовывать вручную — стандартная библиотека предоставляет готовые структуры, например, при вызове os.ReadDir или filepath.WalkDir.

Пример

Давайте прочитаем содержимое текущей директории и выведем имена и типы всех элементов:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  entries, err := os.ReadDir(".")
  if err != nil {
    fmt.Println("Error reading directory:", err)
    return
  }

  for _, entry := range entries {
    fmt.Printf("%s (isDir: %t)\n", entry.Name(), entry.IsDir())
  }
}

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

go"main.go (isDir: false)"
"src (isDir: true)"
"README.md (isDir: false)"

Пример

Для получения полной информации о файле, такой как размер или время изменения, используется метод Info:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  entries, err := os.ReadDir(".")
  if err != nil {
    fmt.Println("Error reading directory:", err)
    return
  }

  for _, entry := range entries {
    info, err := entry.Info()
    if err != nil {
      fmt.Printf("Error getting info for %s: %v\n", entry.Name(), err)
      continue
    }
    fmt.Printf("%s: %d bytes\n", entry.Name(), info.Size())
  }
}

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

go"main.go: 1024 bytes"
"src: 4096 bytes"
"README.md: 512 bytes"

Пример

Интерфейс fs.DirEntry также используется при обходе дерева директорий с помощью filepath.WalkDir. Передаваемая в функцию обратного вызова запись позволяет принимать решения о дальнейшем обходе:

gopackage main

import (
  "fmt"
  "path/filepath"
)

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

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

go"Visit: ."
"Visit: main.go"
"Skip directory: src"

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

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