Перейти к содержимому

Файловая система

Чтение, запись и управление файлами в изолированных томах файловой системы.

Настройку файловой системы см. в Filesystem.

local fs = require("fs")

Получить том файловой системы по ID реестра:

local vol, err = fs.get("app:storage")
if err then
return nil, err
end
local content = vol:readfile("/config.json")
ПараметрТипОписание
namestringID тома в реестре

Возвращает: FS, error

Тома не требуют явного освобождения. Они управляются на системном уровне и становятся недоступны при отключении файловой системы от реестра.

Чтение всего содержимого файла:

local vol = fs.get("app:config")
local data, err = vol:readfile("/settings.json")
if err then
return nil, err
end
local config = json.decode(data)

Для больших файлов используйте потоковое чтение через open():

local file = vol:open("/data/large.csv", "r")
while true do
local chunk = file:read(65536)
if not chunk or #chunk == 0 then break end
process(chunk)
end
file:close()

Запись данных в файл:

local vol = fs.get("app:data")
-- Перезапись (по умолчанию)
vol:writefile("/config.json", json.encode(config))
-- Дозапись
vol:writefile("/logs/app.log", message .. "\n", "a")
-- Эксклюзивная запись (ошибка если существует)
local ok, err = vol:writefile("/lock.pid", tostring(pid), "wx")
РежимОписание
"w"Перезапись (по умолчанию)
"a"Дозапись
"wx"Эксклюзивная запись (ошибка если файл существует)

Для потоковой записи:

local file = vol:open("/output/report.txt", "w")
file:write("Header\n")
file:write("Data: " .. value .. "\n")
file:sync()
file:close()
local vol = fs.get("app:data")
-- Проверка существования
if vol:exists("/cache/results.json") then
return vol:readfile("/cache/results.json")
end
-- Проверка директории
if vol:isdir(path) then
process_directory(path)
end
-- Получение информации о файле
local info = vol:stat("/documents/report.pdf")
print(info.size, info.modified, info.type)

Поля stat: name, size, mode, modified, is_dir, type

local vol = fs.get("app:data")
-- Создание директории
vol:mkdir("/uploads/" .. user_id)
-- Список содержимого директории
for entry in vol:readdir("/documents") do
print(entry.name, entry.type)
end
-- Удаление файла или пустой директории
vol:remove("/temp/file.txt")

Поля записи: name, type (“file” или “directory”)

При использовании vol:open() для потоковой работы:

МетодОписание
read(size?)Прочитать байты (по умолчанию: 4096)
write(data)Записать строковые данные
seek(whence, offset)Установить позицию (“set”, “cur”, “end”)
stat()Получить информацию о файле (те же поля, что и vol:stat)
sync()Сбросить в хранилище
close()Освободить дескриптор
scanner(split?)Создать сканер строк/слов

Всегда вызывайте close() после работы с дескриптором.

Для построчной обработки:

local file = vol:open("/data/users.csv", "r")
local scanner = file:scanner("lines")
scanner:scan() -- пропустить заголовок
while scanner:scan() do
local line = scanner:text()
process(line)
end
file:close()

Режимы разбиения: "lines" (по умолчанию), "words", "bytes", "runes"

fs.type.FILE -- "file"
fs.type.DIR -- "directory"
fs.seek.SET -- от начала
fs.seek.CUR -- от текущей позиции
fs.seek.END -- от конца
МетодВозвращаетОписание
readfile(path) / read_file(path)string, errorПрочитать весь файл
writefile(path, data, mode?) / write_file(path, data, mode?)boolean, errorЗаписать файл
exists(path)boolean, errorПроверить существование пути
stat(path)table, errorПолучить информацию о файле
isdir(path)boolean, errorПроверить директорию
mkdir(path)boolean, errorСоздать директорию
remove(path)boolean, errorУдалить файл/пустую директорию
readdir(path)iteratorСписок содержимого директории
open(path, mode)File, errorОткрыть дескриптор файла
chdir(path)boolean, errorСменить рабочую директорию
pwd()string, errorПолучить рабочую директорию

Доступ к файловой системе подчиняется вычислению политики безопасности.

ДействиеРесурсОписание
fs.getID томаПолучить том файловой системы
УсловиеKindПовторяемо
Пустой путьerrors.INVALIDнет
Некорректный режимerrors.INVALIDнет
Файл закрытerrors.INVALIDнет
Путь не найденerrors.NOT_FOUNDнет
Путь уже существуетerrors.ALREADY_EXISTSнет
Доступ запрещёнerrors.PERMISSION_DENIEDнет

См. Обработка ошибок для работы с ошибками.