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

Интерфейс fs.FS определяет методы для работы с файловой системой. В первый параметр метод Open принимает путь к файлу в виде строки, возвращая интерфейс fs.File и ошибку. Этот интерфейс позволяет абстрагироваться от конкретной реализации файловой системы, будь то реальная файловая система, встроенные ресурсы или виртуальные файловые системы.

Синтаксис

gotype FS interface {
  Open(name string) (fs.File, error)
}

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

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

gopackage main

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

func main() {
  // Создаем FS из текущей директории
  filesystem := os.DirFS(".")

  // Открываем файл
  file, err := filesystem.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  // Читаем содержимое файла
  content, err := io.ReadAll(file)
  if err != nil {
    fmt.Println("Error reading file:", err)
    return
  }

  fmt.Println(string(content))
}

Пример работы с fs.Sub

Функция fs.Sub создает новую файловую систему, которая видит только содержимое указанной поддиректории:

gopackage main

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

func main() {
  // Создаем FS из текущей директории
  rootFS := os.DirFS(".")

  // Создаем подчиненную FS для папки "data"
  subFS, err := fs.Sub(rootFS, "data")
  if err != nil {
    fmt.Println("Error creating sub FS:", err)
    return
  }

  // Открываем файл в подчиненной FS
  file, err := subFS.Open("config.json")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  // Получаем информацию о файле
  info, err := file.Stat()
  if err != nil {
    fmt.Println("Error getting file info:", err)
    return
  }

  fmt.Println("File size:", info.Size())
}

Пример чтения директории

Интерфейс fs.ReadDirFS расширяет fs.FS методом ReadDir для чтения содержимого директории:

gopackage main

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

func main() {
  // Создаем FS из текущей директории
  filesystem := os.DirFS(".")

  // Проверяем, поддерживает ли FS чтение директорий
  if readDirFS, ok := filesystem.(fs.ReadDirFS); ok {
    // Читаем содержимое директории
    entries, err := readDirFS.ReadDir(".")
    if err != nil {
      fmt.Println("Error reading directory:", err)
      return
    }

    // Выводим имена файлов
    for _, entry := range entries {
      fmt.Println(entry.Name())
    }
  }
}

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

  • интерфейс fs.File,
    который представляет открытый файл в файловой системе
  • интерфейс fs.FileInfo,
    который содержит информацию о файле
  • интерфейс fs.DirEntry,
    который представляет элемент директории
  • функцию fs.Sub,
    которая создает подчиненную файловую систему