如何使用 emscripten 将文件从 C 保存到浏览器存储

How to save files from C to browser storage with emscripten

浏览器中的 game engine that I'm using to run my game 运行 lua 并且在我的游戏中我使用正常的 fopen/write/fclose 保存文件。引擎C/C++代码通过emscripten编译成JS。什么是让这些文件写入最终在本地存储或浏览器缓存位置中的其他一些内容的好方法?我已经在网上搜索并查看了文档,但信息非常稀少,我还没有找到关于它应该如何工作的任何明确答案。

游戏引擎的前一位贡献者向 emscripten 构建添加了一个 js 库,它将覆盖 fclose 以回调 javascript。但是这个 fclose 覆盖似乎不再被调用,它根本不包含在最终的 .js 文件中。

Emscripten 文件系统 API 使用 IndexedDB 涵盖您的案例。

这里是Filesystem API overview。它有四种类型:

  1. MEMFS:易失性内存存储。这是在运行时安装在 / 的默认文件系统类型。
  2. NODEFS:这使用 node.js fs api,这不是你的情况。
  3. IDBFS:这利用了 IndexedDB,您可以将其用于离线存储。
  4. WORKERFS:这是为了在工人内部使用。

您可以将 IDBFS 与 Emscripten 自己的 FS API 一起使用(虽然这是 JavaScript-side API)。您需要先安装它才能使用它。您可以使用 FS.mkdir,FS.mount, and FS.syncfs 来实现它。这是 C:

中的粗略示例
#include <emscripten.h>

int main() {
    // EM_ASM is a macro to call in-line JavaScript code.
    EM_ASM(
        // Make a directory other than '/'
        FS.mkdir('/offline');
        // Then mount with IDBFS type
        FS.mount(IDBFS, {}, '/offline');

        // Then sync
        FS.syncfs(true, function (err) {
            // Error
        });
    );

    // Use fopen / write / fclose in C here.
    int off_file = fopen("/offline/any_file");
    ...

    // Don't forget to sync to make sure you store it to IndexedDB
    EM_ASM(
        FS.syncfs(function (err) {
            // Error
        });
    );
}

Here is a more detailed example 来自 Emscripten 存储库。