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

标签 emscripten

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

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

最佳答案

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

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

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

您可以将 IDBFS 与 Emscripten 自己的 FS API 结合使用(尽管这是 JavaScript 端 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 存储库。

关于emscripten - 如何使用 emscripten 将文件从 C 保存到浏览器存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54617194/

相关文章:

c++ - 删除 "-s ONLY_MY_CODE=1"编译参数会导致 WebAssembly 程序中断

c++ - v8 的替代方案,用于将 C++ 对象暴露给 JavaScript(在 PowerPC 上)

c++ - 找不到 "boost_atomic"提供的包配置文件

javascript - 如何将 emscripten 浏览器输入法从 window.prompt 更改为更合理的输入法?

c++ - 从使用 emscripten 编译的 C++ 连接 websocket 时出现问题

javascript - 我可以以某种方式构建 webassembly 代码*没有* emscripten "glue"吗?

使用 Emscripten 编译 Nim 和 SDL2 Image 时出现类型冲突

c++14 - Emscripten 和 C++14

c++ - Emscripten 1.34.1 问题

c++ - OpenGL 和 WebGL 之间的 Alpha 渲染差异