Интерфейс fs.DirEntry
Интерфейс fs.DirEntry представляет собой элемент директории (файл или папку),
полученный при чтении содержимого каталога. Он используется в таких функциях как
os.ReadDir и fs.ReadDir. Основное назначение этого интерфейса —
предоставить быстрый доступ к основным свойствам записи без необходимости
выполнять полноценный системный вызов Stat для каждого элемента.
Интерфейс содержит методы: Name для получения имени,
IsDir для проверки, является ли запись директорией,
Type для получения типа файла в виде fs.FileMode,
и Info для получения полной информации о записи в виде интерфейса fs.FileInfo.
Синтаксис
type DirEntry interface {
Name() string
IsDir() bool
Type() FileMode
Info() (FileInfo, error)
}
Для работы с интерфейсом обычно не требуется его реализовывать вручную —
стандартная библиотека предоставляет готовые структуры, например,
при вызове os.ReadDir или filepath.WalkDir.
Пример
Давайте прочитаем содержимое текущей директории и выведем имена и типы всех элементов:
package 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())
}
}
Результат выполнения кода:
"main.go (isDir: false)"
"src (isDir: true)"
"README.md (isDir: false)"
Пример
Для получения полной информации о файле, такой как размер или время изменения,
используется метод Info:
package 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())
}
}
Результат выполнения кода:
"main.go: 1024 bytes"
"src: 4096 bytes"
"README.md: 512 bytes"
Пример
Интерфейс fs.DirEntry также используется при обходе дерева директорий
с помощью filepath.WalkDir. Передаваемая в функцию обратного вызова
запись позволяет принимать решения о дальнейшем обходе:
package 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)
}
}
Результат выполнения кода:
"Visit: ."
"Visit: main.go"
"Skip directory: src"
Смотрите также
-
функцию
os.ReadDir,
которая возвращает срез элементов директории в видеfs.DirEntry -
функцию
filepath.WalkDir,
которая обходит дерево файловой системы с использованиемfs.DirEntry -
интерфейс
fs.FileInfo,
который предоставляет полную информацию о файле -
функцию
os.Stat,
которая возвращает информацию о файле по его пути