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

时间:2019-02-10 14:09:18

标签: emscripten

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

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

1 个答案:

答案 0 :(得分:2)

Emscripten Filesystem API使用IndexedDB解决了您的情况,但是您可能需要添加fopen / write / fclose以外的一些代码。

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

  1. MEMFS:一种易失的内存存储。这是默认的文件系统类型,该文件系统类型在运行时安装在/上。
  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存储库。