--- title: Работа с файлами brief: Данное руководство объясняет как сохранять и загружать файлы и производить другие виды файловых операций. --- # Работа с файлами Есть несколько разных способов создать и/или получить доступ к файлам. Пути файлов и способы, которыми вы получаете доступ к этим файлам различаются в зависимости от типа файла и размещения файла. ## Функции для доступа к файлам и директориям Defold предоставляет несколько разных функций для работы с файлами: * Можно использовать стандартные [`io.*` функции](https://defold.com/ref/stable/io/) для чтения и записи файлов. Эти функции дают вам очень тонкий уровень контроля над всем процессом ввода-вывода. * Можно использовать [`os.rename()`](https://defold.com/ref/stable/os/#os.rename:oldname-newname) и [`os.remove()`](https://defold.com/ref/stable/os/#os.remove:filename) для переименования и удаления файлов. * Можно использовать [`sys.save()`](https://defold.com/ref/stable/sys/#sys.save:filename-table) и [`sys.load()`](https://defold.com/ref/stable/sys/#sys.load:filename) для чтения и записи Lua-таблиц. Существуют дополнительные функции [`sys.*`](https://defold.com/ref/stable/sys/) чтобы помочь платформенно-независимо определять пути файла. ## Места расположения файлов и директорий Места расположения файлов и директорий могут быть поделены на три категории: * Специфичные для приложения файлы, созданные вашим приложением * Файлы и директории поставляемые с вашим приложением * Специфичные для системы файлы, к которым получает доступ ваше приложение ### Как сохранять и загружать файлы специфичные для приложения Когда сохраняются или загружаются файлы специфичные для приложения, такие как рекорды, настройки игрока или игровое состояние, рекомендуется делать это в месте расположения, предоставляемом операционной системой и предназначенной специально для этих целей. Вы можете использовать [`sys.get_save_file()`](https://defold.com/ref/stable/sys/#sys.get_save_file:application_id-file_name), чтобы получить специфичный для конкретной ОС абсолютный путь до файла. Получив абсолютный путь, вы можете использовать функции `sys.*`, `io.*` и `os.*` (смотри выше). [Посмотрите пример, демонстрирующий как применять sys.save() и sys.load()](/examples/file/sys_save_load/). ### Как получать доступ к файлам, поставляемым вместе с приложением Вы можете поставлять файлы с вашим приложением двумя способами: 1. **CUSTOM RESOURCES** --- Как часть архива игры используя [поле *Custom Resources*](https://defold.com/manuals/project-settings/#project) в *game.project*. Вы можете читать из этих файлов используя [`sys.load_resource()`](https://defold.com/ref/sys/#sys.load_resource). Заметьте, что эти файлы не являются реальными файлами в файловой системе. Файлы, включенные таким способом становятся частью бинарного архива игры и единственный способ получить к ним доступ --- через вызов `sys.load_resource()`. 2. **BUNDLE RESOURES** --- Как дополнительные файлы и директории, располагаемые как часть бандла вашего приложения используя [поле *Bundle Resources*](https://defold.com/manuals/project-settings/#project) в *game.project*. Вы можете использовать [`sys.get_application_path()`](https://defold.com/ref/stable/sys/#sys.get_application_path:), чтобы получить путь до места, где хранится приложение. Используйте этот базовый путь до приложения для создания окончательных абсолютных путей до файлов, к которым вам нужно получить доступ. Имея абсолютный путь к этим файлам, вы можете использовать функции `io.*` и `os.*` для доступа к файлам (см. выше). ::: sidenote Из соображений безопасности браузеры (и, как следствие, любой JavaScript, работающий в браузере) не имеют доступа к системным файлам. Файловые операции в HTML5 билдах в Defold по-прежнему работают, однако они работают на "виртуальной файловой системе" используя IndexedDB API в браузере. Это означает, что не существует способа получить доступ к ресурсам бандла используя функции `io.*` или `os.*`. Однако вы можете получить доступ к ресурсам бандла используя вызов `http.request()`. ::: #### Custom и Bundle ресурсы - сравнение | Характеристики | Custom Ресурсы | Bundle Ресурсы | |-----------------------------|-------------------------------------------|------------------------------------------------| | Скорость загрузки | Быстрее - файлы загружаются из бинарного архива | Медленнее - файлы загружаются из файловой системы | | Частичная загрузка файлов | Нет - только целиком | Да - произвольное чтение байт из файлов | | Изменение файлов после поставки | Нет - файлы хранятся внутри бинарного архива | Да - файлы хранятся на локальной файловой системе | | Поддержка HTML5 | Да | Да - но доступ через HTTP, а не файловый ввод-вывод | ### Доступ к системным файлам Доступ к системным файлам может быть ограничен операционной системой из соображений безопасности. Вы можете использовать нативное расширение [`extension-directiories`](https://defold.com/assets/extensiondirectories/) для получения абсолютных путей до некоторых общих системных директорий (то есть документы, ресурсы, temp). Имея абсолютный путь к этим файлам вы можете использовать функции `io.*` и `os.*` для получения доступа к этим файлам (смотри выше). ::: sidenote Из соображений безопасности браузеры (и, как следствие, любой JavaScript, работающий в браузере) не имеют доступа к системным файлам. Файловые операции в HTML5 билдах в Defold по-прежнему работают, однако они работают на "виртуальной файловой системе" используя IndexedDB API в браузере. Это означает, что не существует способа получить доступ к системным файлам в HTML5 билдах. ::: ## Расширения [Портал ассетов](https://defold.com/assets/) содержит несколько ассетов для упрощения доступа к файлам и директориям. Некоторые из примеров: * [Lua File System (LFS)](https://defold.com/assets/luafilesystemlfs/) --- Функции для работы с директориями, разрешениями файлов и т.д. * [DefSave](https://defold.com/assets/defsave/) --- Модуль, помогающий сохранять/загружать конфиг и данные игрока между сессиями.