Тип os.DirEntry

Тип os.DirEntry представляет запись о файле или директории в файловой системе. Он описывает отдельный элемент внутри директории, например, файл, папку или символьную ссылку. Объекты, реализующие этот интерфейс, возвращаются функциями os.ReadDir и os.File.ReadDir, и позволяют получить информацию о записи без необходимости выполнять отдельный вызов os.Stat для каждого элемента, что делает их эффективными для массового чтения содержимого папок.

Интерфейс os.DirEntry содержит несколько важных методов: Name возвращает имя записи, IsDir проверяет, является ли запись директорией, Type возвращает битовую маску с типом записи, а Info возвращает подробную информацию типа os.FileInfo.

Синтаксис

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

Пример

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

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: %v\n", entry.Name(), entry.IsDir())
  }
}

Пример

Проверим, является ли запись директорией, и получим детальную информацию через метод 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 {
    if !entry.IsDir() {
      info, err := entry.Info()
      if err != nil {
        fmt.Printf("Error getting info for %s: %v\n", entry.Name(), err)
        continue
      }
      fmt.Printf("File: %s, Size: %d bytes\n", entry.Name(), info.Size())
    }
  }
}

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

go"File: go.mod, Size: 42 bytes"
"File: main.go, Size: 128 bytes"

Пример

Используем метод Type для определения типа записи в виде битовой маски os.FileMode:

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 {
    mode := entry.Type()
    fmt.Printf("%s: Type: %v\n", entry.Name(), mode)
  }
}

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

go"go.mod: Type: -rw-r--r--"
"main.go: Type: -rw-r--r--"
"images: Type: drwxr-xr-x"

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

  • функцию os.ReadDir,
    которая возвращает срез os.DirEntry для указанной директории
  • функцию os.File.ReadDir,
    которая читает содержимое открытого файла директории
  • интерфейс fs.DirEntry,
    который используется в пакете io/fs для работы с файловыми системами
  • тип os.FileInfo,
    который предоставляет более полную информацию о файле