--- title: Работа с файлами brief: Данное руководство объясняет как сохранять и загружать файлы и производить другие виды файловых операций. --- # Работа с файлами Существует множество различных способов создания и/или доступа к файлам. Пути к файлам и способы доступа к ним зависят от типа файла и его расположения. ## Функции для доступа к файлам и папкам Defold предоставляет несколько разных функций для работы с файлами: * Вы можете использовать стандартные функции [`io.*`](https://defold.com/ref/stable/io/) для чтения и записи файлов. Эти функции дают вам очень тонкий контроль над процессом ввода-вывода. ```lua -- открыть 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()`](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/) помогают с платформонезависимым разрешением путей к файлам. ```lua -- получить платформонезависимый путь к файлу "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()`](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/). ### Как получить доступ к файлам, включённым в приложение Вы можете включать файлы в ваше приложение с помощью ресурсов бандла и пользовательских ресурсов. #### Пользовательские ресурсы :[Пользовательские ресурсы](../shared/custom-resources.md) ```lua -- Загрузить данные уровня в строку 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 ``` #### Ресурсы бандла :[Ресурсы бандла](../shared/bundle-resources.md) ```lua 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`](https://defold.com/assets/extensiondirectories/), чтобы получить абсолютные пути к некоторым распространённым системным папкам (например, документы, ресурсы, временные файлы). Получив абсолютный путь к этим файлам, вы можете использовать функции `io.*` и `os.*` для доступа к ним (см. выше). ::: sidenote По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в "виртуальной файловой системе" с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к системным файлам в HTML5 сборках. ::: ## Расширения [Asset Portal](https://defold.com/assets/) содержит несколько ассетов, упрощающих работу с файлами и папками. Некоторые примеры: * [Lua File System (LFS)](https://defold.com/assets/luafilesystemlfs/) — функции для работы с директориями, правами доступа к файлам и т.д. * [DefSave](https://defold.com/assets/defsave/) — модуль для удобного сохранения и загрузки конфигураций и данных игрока между сессиями.