Read this manual in English

Работа с файлами

Есть несколько разных способов создать и/или получить доступ к файлам. Пути файлов и способы, которыми вы получаете доступ к этим файлам различаются в зависимости от типа файла и размещения файла.

Функции для доступа к файлам и директориям

Defold предоставляет несколько разных функций для работы с файлами:

  • Можно использовать стандартные io.* функции для чтения и записи файлов. Эти функции дают вам очень тонкий уровень контроля над всем процессом ввода-вывода.
  • Можно использовать os.rename() и os.remove() для переименования и удаления файлов.
  • Можно использовать sys.save() и sys.load() для чтения и записи Lua-таблиц. Существуют дополнительные функции sys.* чтобы помочь платформенно-независимо определять пути файла.

Места расположения файлов и директорий

Места расположения файлов и директорий могут быть поделены на три категории:

  • Специфичные для приложения файлы, созданные вашим приложением
  • Файлы и директории поставляемые с вашим приложением
  • Специфичные для системы файлы, к которым получает доступ ваше приложение

Как сохранять и загружать файлы специфичные для приложения

Когда сохраняются или загружаются файлы специфичные для приложения, такие как рекорды, настройки игрока или игровое состояние, рекомендуется делать это в месте расположения, предоставляемом операционной системой и предназначенной специально для этих целей. Вы можете использовать sys.get_save_file(), чтобы получить специфичный для конкретной ОС абсолютный путь до файла. Получив абсолютный путь, вы можете использовать функции sys.*, io.* и os.* (смотри выше).

Посмотрите пример, демонстрирующий как применять sys.save() и sys.load().

Как получать доступ к файлам, поставляемым вместе с приложением

Вы можете поставлять файлы с вашим приложением двумя способами:

  1. CUSTOM RESOURCES — Как часть архива игры используя поле Custom Resources в game.project. Вы можете читать из этих файлов используя sys.load_resource(). Заметьте, что эти файлы не являются реальными файлами в файловой системе. Файлы, включенные таким способом становятся частью бинарного архива игры и единственный способ получить к ним доступ — через вызов sys.load_resource().

  2. BUNDLE RESOURES — Как дополнительные файлы и директории, располагаемые как часть бандла вашего приложения используя поле Bundle Resources в game.project. Вы можете использовать sys.get_application_path(), чтобы получить путь до места, где хранится приложение. Используйте этот базовый путь до приложения для создания окончательных абсолютных путей до файлов, к которым вам нужно получить доступ. Имея абсолютный путь к этим файлам, вы можете использовать функции io.* и os.* для доступа к файлам (см. выше).

Из соображений безопасности браузеры (и, как следствие, любой JavaScript, работающий в браузере) не имеют доступа к системным файлам. Файловые операции в HTML5 билдах в Defold по-прежнему работают, однако они работают на “виртуальной файловой системе” используя IndexedDB API в браузере. Это означает, что не существует способа получить доступ к ресурсам бандла используя функции io.* или os.*. Однако вы можете получить доступ к ресурсам бандла используя вызов http.request().

Custom и Bundle ресурсы - сравнение

Характеристики Custom Ресурсы Bundle Ресурсы
Скорость загрузки Быстрее - файлы загружаются из бинарного архива Медленнее - файлы загружаются из файловой системы
Частичная загрузка файлов Нет - только целиком  Да - произвольное чтение байт из файлов
Изменение файлов после поставки Нет - файлы хранятся внутри бинарного архива Да - файлы хранятся на локальной файловой системе
 Поддержка HTML5 Да Да - но доступ через HTTP, а не файловый ввод-вывод

Доступ к системным файлам

Доступ к системным файлам может быть ограничен операционной системой из соображений безопасности. Вы можете использовать нативное расширение extension-directiories для получения абсолютных путей до некоторых общих системных директорий (то есть документы, ресурсы, temp). Имея абсолютный путь к этим файлам вы можете использовать функции io.* и os.* для получения доступа к этим файлам (смотри выше).

Из соображений безопасности браузеры (и, как следствие, любой JavaScript, работающий в браузере) не имеют доступа к системным файлам. Файловые операции в HTML5 билдах в Defold по-прежнему работают, однако они работают на “виртуальной файловой системе” используя IndexedDB API в браузере. Это означает, что не существует способа получить доступ к системным файлам в HTML5 билдах.

Расширения

Портал ассетов содержит несколько ассетов для упрощения доступа к файлам и директориям. Некоторые из примеров:

  • Lua File System (LFS) — Функции для работы с директориями, разрешениями файлов и т.д.
  • DefSave — Модуль, помогающий сохранять/загружать конфиг и данные игрока между сессиями.