title: 处理文件
存取文件有很多种方式. 文件的路径和文件类型决定了采取何种方式.
Defold 提供如下函数用以存取文件/文件夹:
io.* functions. 用于文件/文件夹存取, 底层高效细致灵活.os.rename() 和 os.remove() 用于文件改名和删除.sys.save() 和 sys.load() 用于存取 Lua 表. 其他 sys.* 下的函数用于不同操作系统文件路径的解析.有三个文件/文件夹位置可供游戏应用存取使用:
像最高分数, 用户设置和游戏状态等信息建议如此处理. 用 sys.get_save_file() 函数得到操作系统指定的文件绝对路径. 然后用 sys.*, io.* 和 os.* 函数处理文件/文件夹 (见上文).
Check the example showing how to use sys.save() and sys.load().
把文件打包进游戏应用有两种方法:
用户资源文件 - 在 game.project 配置文件的 Custom Resources 项 进行设置. 然后可以使用 sys.load_resource() 函数进行访问. 注意这些文件实际上并不存在于用户的操作系统之中. 这样打包的文件作为游戏包的一部分只可以使用 sys.load_resource() 进行访问.
打包资源文件 - 在 game.project 配置文件的 Bundle Resources 项 进行设置. 然后可以使用 sys.get_application_path() 得到应用的实际路径. 再基于应用路径得到资源文件的完整路径. 之后就可以使用 io.* 和 os.* 的功能函数进行访问 (参见上文).
::: sidenote
基于安全考虑浏览器 (及浏览器里运行的 JavaScript 插件) 不允许访问本地文件. 虽然 HTML5 游戏也能运行, 但是只能用浏览器提供的 IndexedDB API 在 "虚拟文件系统" 中存取数据. 也就是说不允许使用 io.* 和 os.* 下的函数. 但是可以用 http.request() 请求在线资源文件.
:::
| 特点 | 用户资源 | 打包资源 |
|---|---|---|
| 加载速度 | 快 - 从应用二进制包内加载 | 慢 - 从文件系统中加载 |
| 加载单个文件的功能 | 无 - 只能加载全部资源 | 有 - 基于文件的字节读取 |
| 应用打包后修改资源文件 | 无 - 所有资源保存为一个二进制资源包 | 有 - 文件存储基于文件操作系统 |
| HTML5 支持 | 有 | 有 - 但是这里的访问基于 http 而不是文件 I/O |
基于安全考虑操作系统所管理的文件存取被严格限制. 可以使用 extension-directiories 原生扩展来存取某些地方的绝对路径 (例如 documents, resource, temp). 然后用 sys.*, io.* 和 os.* 函数处理文件/文件夹 (见上文).
::: sidenote 出于安全考虑浏览器 (连同浏览器里运行的 JavaScript 扩展程序) 不可访问系统文件. Defold 的 HTML5 文件存取程序依然工作, 但只是在浏览器以 IndexedDB API 提供的 "虚拟文件系统" 上. 这意味着 HTML5 应用不能真正存取系统文件. :::
在 资源中心 里有些原生扩展能简化文件存取的工作. 例如: