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.*. Ці функції дають змогу дуже точно керувати всім процесом введення-виведення.-- open myfile.txt for writing in binary mode
-- returns nil plus error message on failure
local f, err = io.open("path/to/myfile.txt", "wb")
if not f then
print("Something went wrong while opening the file", err)
return
end
-- write to the file, flush it to disk and then close the file
f:write("Foobar")
f:flush()
f:close()
-- open myfile.txt for reading in binary mode
-- returns nil plus error message on failure
local f, err = io.open("path/to/myfile.txt", "rb")
if not f then
print("Something went wrong while opening the file", err)
return
end
-- read the entire file as a string
-- returns nil on failure
local s = f:read("*a")
if not s then
print("Error while reading file")
return
end
print(s) -- Foobar
Для перейменування й видалення файлів можна використовувати os.rename() та os.remove().
Для читання й записування таблиць Lua можна використовувати sys.save() та sys.load(). Додаткові функції sys.* допомагають визначати шляхи до файлів незалежно від платформи.
-- get a platform independent path to the file "highscore" for application "mygame"
local path = sys.get_save_file("mygame", "highscore")
-- save a Lua table with some data
local ok = sys.save(path, { highscore = 100 })
if not ok then
print("Failed to save", path)
return
end
-- load the data
local ok, data = pcall(sys.load, path)
if not ok then
-- The file exists, but is corrupt, foreign, or uses an unsupported format.
print("Failed to load save data:", data)
data = {}
end
print(data.highscore) -- 100
sys.load() повертає порожню таблицю, якщо файл не існує. Якщо файл існує, але його створено не за допомогою sys.save(), він пошкоджений або використовує непідтримуваний формат серіалізованої таблиці, sys.load() спричиняє помилку Lua. Використовуйте pcall(), як показано вище, коли потрібно забезпечити відновлення після пошкодження або зовнішньої зміни збережених даних.
Розташування файлів і папок можна поділити на три категорії:
Для зберігання й завантаження файлів застосунку, як-от рекордів, налаштувань користувача та стану гри, рекомендовано використовувати розташування, яке операційна система надає спеціально для цієї мети. За допомогою sys.get_save_file() можна отримати абсолютний шлях до файлу для відповідної ОС. Отримавши абсолютний шлях, ви можете використовувати функції sys.*, io.* та os.* (див. вище).
Перегляньте приклад використання sys.save() і sys.load().
Ви можете включити файли до свого застосунку за допомогою ресурсів пакета (bundle resources) та користувацьких ресурсів (custom resources).
Користувацькі ресурси включають до основного архіву гри за допомогою поля Custom Resources у game.project.
Поле Custom Resources має містити розділений комами список ресурсів, які буде включено до основного архіву гри. Якщо вказано каталоги, усі вкладені файли та каталоги включаються рекурсивно. Читати ці файли можна за допомогою sys.load_resource().
-- Load level data into a string
local data, error = sys.load_resource("/assets/level_data.json")
-- Decode json string to a Lua table
if data then
local data_table = json.decode(data)
pprint(data_table)
else
print(error)
end
Ресурси пакета — це додаткові файли й папки, які включають до пакета застосунку за допомогою поля 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 працюють, але лише у «віртуальній файловій системі», яка використовує API IndexedDB у браузері. Це означає, що отримати доступ до ресурсів пакета за допомогою функцій io.* або os.* неможливо. Однак ви можете отримати доступ до ресурсів пакета за допомогою http.request().
| Характеристика | Користувацькі ресурси | Ресурси пакета |
|---|---|---|
| Швидкість завантаження | Швидше — файли завантажуються з двійкового архіву | Повільніше — файли завантажуються з файлової системи |
| Часткове завантаження файлів | Ні — лише файли цілком | Так — читання довільних байтів із файлу |
| Змінення файлів після пакування | Ні — файли зберігаються всередині двійкового архіву | Так — файли зберігаються в локальній файловій системі |
| Підтримка HTML5 | Так | Так — але доступ через http, а не файлове введення-виведення |
Операційна система може обмежувати доступ до системних файлів із міркувань безпеки. За допомогою нативного розширення extension-directories можна отримати абсолютний шлях до деяких поширених системних каталогів (наприклад, documents, resource, temp). Отримавши абсолютний шлях до цих файлів, ви можете використовувати функції io.* та os.* для доступу до них (див. вище).
З міркувань безпеки браузерам (а отже, і будь-якому коду JavaScript, що виконується у браузері) заборонено доступ до системних файлів. Файлові операції у збірках HTML5 у Defold працюють, але лише у «віртуальній файловій системі», яка використовує API IndexedDB у браузері. Це означає, що у збірках HTML5 неможливо отримати доступ до системних файлів.
На порталі Defold Assets є кілька ресурсів для спрощення доступу до файлів і папок. Ось деякі приклади: