Функция fs.Sub

Функция fs.Sub создает новую файловую систему, которая представляет собой поддерево указанной файловой системы. В первый параметр передается исходная файловая система, во второй параметр - путь к директории внутри этой файловой системы, которая станет корнем новой файловой системы. Функция возвращает новую файловую систему и ошибку, если указанная директория не существует или недоступна.

Синтаксис

gofs.Sub(fsys fs.FS, dir string) (fs.FS, error)

Пример

Давайте создадим новую файловую систему, которая будет представлять поддерево директории "static" в существующей файловой системе:

gopackage main

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

func main() {
  staticFS, err := fs.Sub(os.DirFS("."), "static")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  entries, err := fs.ReadDir(staticFS, ".")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  for _, entry := range entries {
    fmt.Println(entry.Name())
  }
}

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

go"index.html"
"css"
"js"
"images"

В этом примере мы создали новую файловую систему staticFS, которая работает с содержимым директории "static", как будто это корневая директория.

Пример

Давайте используем новую файловую систему для чтения файла относительно корня поддерева:

gopackage main

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

func main() {
  subFS, err := fs.Sub(os.DirFS("."), "static")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  data, err := fs.ReadFile(subFS, "index.html")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(string(data))
}

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

go"<!DOCTYPE html><html><head><title>Hello</title></head></html>"

Обратите внимание, что при работе с новой файловой системой путь "index.html" интерпретируется относительно директории "static", а не корня исходной файловой системы.

Пример

Давайте проверим, что будет при попытке создать поддерево для несуществующей директории:

gopackage main

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

func main() {
  subFS, err := fs.Sub(os.DirFS("."), "nonexistent")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  _, err = fs.ReadDir(subFS, ".")
  if err != nil {
    fmt.Println("Error:", err)
  }
}

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

go"Error: open nonexistent: no such file or directory"

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

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