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

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

Интерфейс fs.File включает методы Read, Close, Stat и другие. Метод Read читает данные из файла в предоставленный срез байтов и возвращает количество прочитанных байтов и ошибку. Метод Close закрывает файл и освобождает связанные с ним ресурсы. Метод Stat возвращает информацию о файле, такую как размер и время изменения.

Синтаксис

gotype File interface {
  Read([]byte) (int, error)
  Close() error
  Stat() (FileInfo, error)
}

Пример

Давайте откроем файл с помощью функции fs.ReadFile и прочитаем его содержимое:

gopackage main

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

func main() {
  data, err := fs.ReadFile(os.DirFS("."), "example.txt")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(string(data))
}

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

go"Hello, World!"

Пример

Давайте используем метод Read для чтения данных из файла в буфер:

gopackage main

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

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer file.Close()

  buf := make([]byte, 100)
  n, err := file.Read(buf)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(string(buf[:n]))
}

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

go"Hello, World!"

Пример

Давайте получим информацию о файле с помощью метода Stat:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer file.Close()

  info, err := file.Stat()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println("File size:", info.Size())
  fmt.Println("Is directory:", info.IsDir())
  fmt.Println("Permission:", info.Mode())
}

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

go"File size: 13"
"Is directory: false"
"Permission: -rw-r--r--"

Пример

Давайте используем интерфейс fs.File с виртуальной файловой системой для чтения встроенных файлов:

gopackage main

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

//go:embed example.txt
var embeddedFiles embed.FS

func main() {
  file, err := embeddedFiles.Open("example.txt")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer file.Close()

  stat, err := file.Stat()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println("File name:", stat.Name())
  fmt.Println("File size:", stat.Size())
}

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

go"File name: example.txt"
"File size: 13"

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

  • интерфейс fs.FS,
    который представляет виртуальную файловую систему
  • функцию os.Open,
    которая открывает файл по указанному пути
  • функцию fs.ReadFile,
    которая читает все содержимое файла
  • интерфейс os.FileInfo,
    который содержит информацию о файле