Как сохранить файлы из C в хранилище браузера с помощью emscripten - PullRequest
0 голосов
/ 10 февраля 2019

игровой движок , который я использую для запуска своей игры в браузере, запускает lua, и из моей игры я сохраняю файлы, используя обычную fopen / write / fclose.Код движка C / C ++ компилируется в JS через emscripten.Каков хороший способ получить доступ к этим файлам в локальном хранилище или в другом месте в кэше браузера?Я искал в Интернете и смотрел на документацию, но информация очень скудная, я не нашел четких ответов на вопрос, как это должно работать.

Предыдущий участник движка игры добавил библиотеку js всборка emscripten, которая переопределяет fclose для обратного вызова javascript.Но это переопределение fclose, похоже, больше не вызывается, оно вообще не включено в окончательный файл .js.

1 Ответ

0 голосов
/ 11 февраля 2019

API файловой системы Emscripten покрывает ваш случай с использованием IndexedDB, но вам может потребоваться добавить некоторые коды, отличные от fopen / write / fclose.

Вот обзор API файловой системы .Он имеет четыре типа:

  1. MEMFS: энергозависимое хранилище в памяти.Это тип файловой системы по умолчанию, который монтируется на / во время выполнения.
  2. NODEFS: здесь используется файл node.js fs api, который не подходит для вашего случая.
  3. IDBFS:При этом используется IndexedDB, и вы можете использовать его для автономного хранения.
  4. WORKERFS: предназначен для использования внутри рабочего.

Вы можете использовать IDBFSс собственным FS API Emscripten (хотя это API на стороне JavaScript).Вы должны смонтировать это сначала, чтобы использовать это.Вы можете достичь этого, используя FS.mkdir, FS.mount и 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
        });
    );
}

Вот более подробный пример из репозитория Emscripten.

...