Manuals
Manuals




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.* 函数来读写文件。这些函数为您提供了对整个 I/O 过程的非常精细的控制。
-- 以二进制模式打开 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
-- 获取应用程序"mygame"的文件"highscore"的平台无关路径
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() 的示例

如何访问与应用程序捆绑的文件

您可以使用捆绑资源和自定义资源将文件包含在您的应用程序中。

自定义资源

自定义资源通过 game.project 中的自定义资源字段捆绑到主游戏存档中。

自定义资源字段应包含将包含在主游戏存档中的以逗号分隔的资源列表。如果指定了目录,则该目录中的所有文件和目录都将被递归包含。您可以使用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

捆绑资源

捆绑资源是使用 game.project 文件中的Bundle Resources 字段作为应用程序包一部分存放的附加文件和文件夹。

Bundle Resources 字段应包含一个以逗号分隔的目录列表,这些目录包含资源文件和文件夹,在打包时应原样复制到最终包中。目录必须使用从项目根目录开始的绝对路径指定,例如 /res。资源目录必须包含以 platformarchitecture-platform 命名的子文件夹。

支持的平台有 iosandroidosxwin32linuxwebswitch。还允许使用名为 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)被阻止访问系统文件。在 Defold 的 HTML5 构建中,文件操作仍然有效,但仅在浏览器中使用 IndexedDB API 的”虚拟文件系统”上有效。这意味着无法使用 io.*os.* 函数访问捆绑资源。但是,您可以使用 http.request() 访问捆绑资源。

自定义和捆绑资源 - 比较

特性 自定义资源 捆绑资源
加载速度 更快 - 从二进制存档加载文件 更慢 - 从文件系统加载文件
加载部分文件 否 - 只能加载整个文件 是 - 从文件读取任意字节
捆绑后修改文件 否 - 文件存储在二进制存档内 是 - 文件存储在本地文件系统上
HTML5 支持 是 - 但通过 http 访问而不是文件 I/O

系统文件访问

出于安全原因,操作系统可能会限制对系统文件的访问。您可以使用 extension-directories 原生扩展来获取一些常见系统目录(即文档、资源、临时文件)的绝对路径。一旦获得这些文件的绝对路径,您就可以使用 io.*os.* 函数来访问文件(见上文)。

出于安全原因,浏览器(以及扩展来说,在浏览器中运行的任何 JavaScript)被阻止访问系统文件。在 Defold 的 HTML5 构建中,文件操作仍然有效,但仅在浏览器中使用 IndexedDB API 的”虚拟文件系统”上有效。这意味着在 HTML5 构建中无法访问系统文件。

扩展

资源门户 包含几个简化文件和文件夹访问的资源。一些示例:

  • Lua 文件系统 (LFS) - 用于处理目录、文件权限等的函数
  • DefSave - 一个帮助您在会话之间保存/加载配置和玩家数据的模块