以下部分简要概述了 Emscripten 文件系统环境 和 架构。除了讨论对标准 C/C++ 同步文件 API 的支持外,它还简要介绍了 文件系统 API 和 Emscripten 的 异步文件系统 API。
原生代码和“普通” JavaScript 使用完全不同的文件访问模式。可移植的原生代码通常在 libc 和 libcxx 中调用同步文件 API,而 JavaScript 仅允许异步文件访问(在 Web 工作器中除外)。此外,当在 Web 浏览器提供的沙箱环境中运行时,JavaScript 无法直接访问主机文件系统。
Emscripten 提供了一个虚拟文件系统来模拟本地文件系统,以便可以使用同步文件 API 的原生代码可以进行编译和运行,而无需进行或只需进行少量更改。
打包文件 说明了如何使用 emcc 指定需要包含在文件系统中的文件。对于许多开发人员来说,这可能是您需要做的全部工作。
Emscripten 文件系统架构的主要元素如下所示。大多数原生代码将调用 libc 和 libcxx 中的同步文件 API。这些 API 反过来调用底层的 文件系统 API,该 API 默认情况下使用 MEMFS 虚拟文件系统。
MEMFS
在运行时初始化时挂载到 /
。要添加到 MEMFS 虚拟文件系统中的文件是在编译时使用 emcc 指定的,如 打包文件 中所述。这些文件在页面首次加载时由 JavaScript 使用 同步 XHR 异步加载。编译后的代码仅在异步下载完成后且文件在虚拟文件系统中可用时才允许运行(并调用同步 API)。
使用 MEMFS
,所有文件严格存在于内存中,并且写入它们的任何数据在页面重新加载时都会丢失。如果需要持久数据,则可以将 IDBFS 文件系统挂载到浏览器中,或者将 NODEFS 挂载到 node.js 上。 NODEFS 提供对本地文件系统的直接访问,但仅在 node.js 内部运行时才提供。您可以直接从自己的 JavaScript 调用 文件系统 API 来挂载新的文件系统,并执行可能需要的其他同步文件系统操作。有关此主题的更多信息,请参阅 文件系统。
如果您需要从网络获取其他文件到文件系统,请使用 emscripten_wget()
和 异步文件系统 API 中的其他方法。这些方法是异步的,应用程序必须等待注册的回调完成才能尝试读取它们。