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

Joa*_*all 6 emscripten

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

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

Bum*_*Kim 9

Emscripten Filesystem API 涵盖了您使用 IndexedDB 的情况。

这是文件系统 API 概述。它有四种类型:

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

您可以使用IDBFSEmscripten 自己的 FS API(尽管这是 JavaScript 端 API)。您需要先安装它才能使用它。您可以通过实现它FS.mkdirFS.mountFS.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
        });
    );
}
Run Code Online (Sandbox Code Playgroud)

这是Emscripten 存储库中更详细的示例