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

Интерфейс fs.StatFS представляет собой файловую систему, которая поддерживает операцию получения информации о файлах и директориях. Он расширяет базовый интерфейс fs.FS и добавляет метод Stat, который возвращает информацию о файле или директории по указанному пути. В качестве первого параметра метод принимает путь к файлу или директории в виде строки, а возвращает объект fs.FileInfo, содержащий информацию о файле, и ошибку, если файл не существует или недоступен.

Синтаксис

gotype StatFS interface {
  FS
  Stat(name string) (fs.FileInfo, error)
}

Пример использования с os.DirFS

Рассмотрим пример получения информации о файле с помощью интерфейса fs.StatFS, используя файловую систему, созданную через os.DirFS:

gopackage main

import (
  "fmt"
  "os"
  "io/fs"
)

func main() {
  fsys := os.DirFS(".")
  if statFS, ok := fsys.(fs.StatFS); ok {
    info, err := statFS.Stat("main.go")
    if err != nil {
      fmt.Printf("Error: %v", err)
      return
    }
    fmt.Printf("Name: %s", info.Name())
    fmt.Printf("Size: %d bytes", info.Size())
    fmt.Printf("IsDir: %t", info.IsDir())
    fmt.Printf("Mode: %s", info.Mode())
  }
}

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

go"Name: main.go"
"Size: 1024 bytes"
"IsDir: false"
"Mode: -rw-r--r--"

Пример с проверкой существования файла

Давайте проверим, существует ли файл в директории, используя интерфейс fs.StatFS:

gopackage main

import (
  "fmt"
  "os"
  "io/fs"
)

func main() {
  fsys := os.DirFS("./data")
  if statFS, ok := fsys.(fs.StatFS); ok {
    _, err := statFS.Stat("config.json")
    if err != nil {
      fmt.Println("File does not exist")
    } else {
      fmt.Println("File exists")
    }
  }
}

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

go"File exists"

Пример получения информации о директории

Рассмотрим, как получить информацию о директории с помощью интерфейса fs.StatFS:

gopackage main

import (
  "fmt"
  "os"
  "io/fs"
)

func main() {
  fsys := os.DirFS(".")
  if statFS, ok := fsys.(fs.StatFS); ok {
    info, err := statFS.Stat(".")
    if err != nil {
      fmt.Printf("Error: %v", err)
      return
    }
    fmt.Printf("Directory name: %s", info.Name())
    fmt.Printf("Is directory: %t", info.IsDir())
    fmt.Printf("Size: %d bytes", info.Size())
  }
}

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

go"Directory name: ."
"Is directory: true"
"Size: 4096 bytes"

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

  • интерфейс fs.FS,
    который является базовым интерфейсом для файловых систем
  • функцию os.Stat,
    которая возвращает информацию о файле в операционной системе
  • интерфейс fs.ReadFileFS,
    который добавляет поддержку чтения файлов
  • интерфейс fs.ReadDirFS,
    который добавляет поддержку чтения директорий