Функция fs.Sub
Функция fs.Sub создает новую файловую систему,
которая представляет собой поддерево указанной файловой системы.
В первый параметр передается исходная файловая система,
во второй параметр - путь к директории внутри этой файловой системы,
которая станет корнем новой файловой системы.
Функция возвращает новую файловую систему и ошибку,
если указанная директория не существует или недоступна.
Синтаксис
fs.Sub(fsys fs.FS, dir string) (fs.FS, error)
Пример
Давайте создадим новую файловую систему, которая будет представлять
поддерево директории "static" в существующей файловой системе:
package 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())
}
}
Результат выполнения кода:
"index.html"
"css"
"js"
"images"
В этом примере мы создали новую файловую систему staticFS,
которая работает с содержимым директории "static",
как будто это корневая директория.
Пример
Давайте используем новую файловую систему для чтения файла относительно корня поддерева:
package 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))
}
Результат выполнения кода:
"<!DOCTYPE html><html><head><title>Hello</title></head></html>"
Обратите внимание, что при работе с новой файловой системой
путь "index.html" интерпретируется относительно
директории "static", а не корня исходной файловой системы.
Пример
Давайте проверим, что будет при попытке создать поддерево для несуществующей директории:
package 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)
}
}
Результат выполнения кода:
"Error: open nonexistent: no such file or directory"
Смотрите также
-
функцию
fs.SubFS,
которая определяет интерфейс для файловых систем с поддержкой поддеревьев -
функцию
fs.ReadDir,
которая читает содержимое директории в файловой системе -
функцию
fs.ReadFile,
которая читает содержимое файла из файловой системы -
функцию
os.DirFS,
которая создает файловую систему из директории операционной системы