Интерфейс fs.FS
Интерфейс fs.FS определяет методы для работы с файловой системой.
В первый параметр метод Open принимает путь к файлу в виде строки,
возвращая интерфейс fs.File и ошибку. Этот интерфейс позволяет
абстрагироваться от конкретной реализации файловой системы, будь то
реальная файловая система, встроенные ресурсы или виртуальные
файловые системы.
Синтаксис
type FS interface {
Open(name string) (fs.File, error)
}
Пример использования с os.DirFS
Рассмотрим пример создания файловой системы из реальной директории
с помощью функции os.DirFS и чтения содержимого файла:
package 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 создает новую файловую систему, которая видит
только содержимое указанной поддиректории:
package 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 для чтения содержимого директории:
package 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,
которая создает подчиненную файловую систему