title: Работа с файлами
Существует множество различных способов создания и/или доступа к файлам. Пути к файлам и способы доступа к ним зависят от типа файла и его расположения.
Defold предоставляет несколько разных функций для работы с файлами:
Вы можете использовать стандартные функции io.*
для чтения и записи файлов. Эти функции дают вам очень тонкий контроль над процессом ввода-вывода.
-- открыть myfile.txt для записи в бинарном режиме
-- возвращает nil и сообщение об ошибке в случае неудачи
local f, err = io.open("path/to/myfile.txt", "wb")
if not f then
print("Произошла ошибка при открытии файла", err)
return
end
-- записать в файл, сбросить буфер на диск и закрыть файл
f:write("Foobar")
f:flush()
f:close()
-- открыть myfile.txt для чтения в бинарном режиме
-- возвращает nil и сообщение об ошибке в случае неудачи
local f, err = io.open("path/to/myfile.txt", "rb")
if not f then
print("Произошла ошибка при открытии файла", err)
return
end
-- прочитать весь файл как строку
-- возвращает nil в случае неудачи
local s = f:read("*a")
if not s then
print("Ошибка при чтении файла")
return
end
print(s) -- Foobar
Вы можете использовать os.rename()
и os.remove()
для переименования и удаления файлов.
Вы можете использовать sys.save()
и sys.load()
для чтения и записи Lua таблиц. Дополнительные функции sys.*
помогают с платформонезависимым разрешением путей к файлам.
-- получить платформонезависимый путь к файлу "highscore" для приложения "mygame"
local path = sys.get_save_file("mygame", "highscore")
-- сохранить Lua таблицу с некоторыми данными
local ok = sys.save(path, { highscore = 100 })
if not ok then
print("Не удалось сохранить", path)
return
end
-- загрузить данные
local data = sys.load(path)
print(data.highscore) -- 100
Расположение файлов и папок можно разделить на три категории:
При сохранении и загрузке файлов, созданных приложением, таких как рекорды, настройки пользователя и состояние игры, рекомендуется использовать расположение, предоставленное операционной системой и предназначенное специально для этой цели. Вы можете использовать sys.get_save_file()
, чтобы получить абсолютный путь к файлу, специфичный для ОС. После получения абсолютного пути вы можете использовать функции sys.*
, io.*
и os.*
(см. выше).
Посмотрите пример использования sys.save()
и sys.load()
.
Вы можете включать файлы в ваше приложение с помощью ресурсов бандла и пользовательских ресурсов.
-- Загрузить данные уровня в строку
local data, error = sys.load_resource("/assets/level_data.json")
-- Декодировать json строку в Lua таблицу
if data then
local data_table = json.decode(data)
pprint(data_table)
else
print(error)
end
local path = sys.get_application_path()
local f = io.open(path .. "/mycommonfile.txt", "rb")
local txt, err = f:read("*a")
if not txt then
print(err)
return
end
print(txt)
::: sidenote
По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в "виртуальной файловой системе" с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к ресурсам бандла с помощью функций io.*
или os.*
. Однако вы можете получить доступ к ресурсам бандла с помощью http.request()
.
:::
Характеристика | Пользовательские ресурсы | Ресурсы бандла |
---|---|---|
Скорость загрузки | Быстрее — файлы загружаются из архива | Медленнее — файлы загружаются из файловой системы |
Загрузка части файла | Нет — только целиком | Да — можно читать произвольные байты файла |
Изменение файлов после упаковки | Нет — файлы хранятся внутри бинарного архива | Да — файлы хранятся в локальной файловой системе |
Поддержка HTML5 | Да | Да — но доступ через http, а не через файловый ввод-вывод |
Доступ к системным файлам может быть ограничен операционной системой по соображениям безопасности. Вы можете использовать нативное расширение extension-directories
, чтобы получить абсолютные пути к некоторым распространённым системным папкам (например, документы, ресурсы, временные файлы). Получив абсолютный путь к этим файлам, вы можете использовать функции io.*
и os.*
для доступа к ним (см. выше).
::: sidenote По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в "виртуальной файловой системе" с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к системным файлам в HTML5 сборках. :::
Asset Portal содержит несколько ассетов, упрощающих работу с файлами и папками. Некоторые примеры: