This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Существует множество различных способов создания и/или доступа к файлам. Пути к файлам и способы доступа к ним зависят от типа файла и его расположения.
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().
Вы можете включать файлы в ваше приложение с помощью ресурсов бандла и пользовательских ресурсов.
Custom resources упаковываются в основной архив игры с помощью поля Custom Resources в game.project.
Поле Custom Resources должно содержать список ресурсов, разделённых запятыми, которые будут включены в основной архив игры. Если указаны каталоги, все файлы и папки в этих каталогах будут включены рекурсивно. Читать эти файлы можно с помощью sys.load_resource().
-- Загрузить данные уровня в строку
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
Bundle resources — это дополнительные файлы и каталоги, расположенные как часть application bundle с использованием поля Bundle Resources в game.project.
Поле Bundle Resources должно содержать список каталогов, разделённых запятыми, с файлами и папками ресурсов, которые нужно скопировать как есть в итоговый пакет при сборке. Каталоги должны указываться абсолютным путём от корня проекта, например /res. Каталог ресурсов должен содержать подкаталоги с именами platform или architecture-platform.
Поддерживаемые платформы: ios, android, osx, win32, linux, web, switch. Также допускается подкаталог common, содержащий ресурсы, общие для всех платформ. Пример:
res
├── win32
│ └── mywin32file.txt
├── common
│ └── mycommonfile.txt
└── android
├── myandroidfile.txt
└── res
└── xml
└── filepaths.xml
Вы можете использовать sys.get_application_path() чтобы получить путь к каталогу, где хранится приложение. Используйте этот базовый путь приложения, чтобы построить окончательный абсолютный путь к нужным вам файлам. Получив абсолютный путь, можно использовать функции io.* и os.* для доступа к этим файлам.
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)
По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в “виртуальной файловой системе” с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к ресурсам бандла с помощью функций io.* или os.*. Однако вы можете получить доступ к ресурсам бандла с помощью http.request().
| Характеристика | Пользовательские ресурсы | Ресурсы бандла |
|---|---|---|
| Скорость загрузки | Быстрее — файлы загружаются из архива | Медленнее — файлы загружаются из файловой системы |
| Загрузка части файла | Нет — только целиком | Да — можно читать произвольные байты файла |
| Изменение файлов после упаковки | Нет — файлы хранятся внутри бинарного архива | Да — файлы хранятся в локальной файловой системе |
| Поддержка HTML5 | Да | Да — но доступ через http, а не через файловый ввод-вывод |
Доступ к системным файлам может быть ограничен операционной системой по соображениям безопасности. Вы можете использовать нативное расширение extension-directories, чтобы получить абсолютные пути к некоторым распространённым системным папкам (например, документы, ресурсы, временные файлы). Получив абсолютный путь к этим файлам, вы можете использовать функции io.* и os.* для доступа к ним (см. выше).
По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в “виртуальной файловой системе” с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к системным файлам в HTML5 сборках.
Asset Portal содержит несколько ассетов, упрощающих работу с файлами и папками. Некоторые примеры:
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB