Emscripten IDBFS/IndexedDB文件写入失效问题求助
解决Emscripten IDBFS文件写入失效问题
你的核心问题是未正确挂载IDBFS文件系统,且没有处理异步同步的时序问题,导致文件只存在于内存文件系统(MEMFS)中,从未同步到IndexedDB。以下是修正方案:
修正后的C文件操作示例
#include <emscripten.h> #include <stdio.h> // 同步完成后的回调函数 EMSCRIPTEN_KEEPALIVE void sync_finished() { printf("文件已同步到IndexedDB\n"); emscripten_exit_with_live_runtime(); } // 挂载完成后执行文件写入 EMSCRIPTEN_KEEPALIVE void write_to_idbfs() { // 必须在IDBFS挂载目录下操作文件 FILE* fp = fopen("/idbfs/test.txt", "w"); if (fp) { fprintf(fp, "test\n"); fclose(fp); // 将内存文件同步到IndexedDB(false表示内存→IDB) EM_ASM( FS.syncfs(false, function(err) { assert(!err); ccall('sync_finished', null, [], []); }); ); } else { printf("fopen失败\n"); emscripten_exit_with_live_runtime(); } } int main() { // 1. 创建挂载目录并挂载IDBFS EM_ASM( FS.mkdir('/idbfs'); FS.mount(IDBFS, {}, '/idbfs'); // 2. 先从IDB加载现有数据(true表示IDB→内存) FS.syncfs(true, function(err) { assert(!err); // 3. 加载完成后调用C端写入逻辑 ccall('write_to_idbfs', null, [], []); }); ); return 0; }
编译命令
emcc test.c -lidbfs.js -s FORCE_FILESYSTEM=1 -s NO_EXIT_RUNTIME=1 --emrun -o test.html
修正后的JS文件操作示例
#include <emscripten.h> #include <stdio.h> int main() { EM_ASM( // 挂载IDBFS到指定目录 FS.mkdir('/idbfs'); FS.mount(IDBFS, {}, '/idbfs'); // 先加载IDB现有数据 FS.syncfs(true, function(err) { assert(!err); // 在挂载目录下写入文件 FS.writeFile('/idbfs/test.txt', 'test\n'); // 同步到IndexedDB FS.syncfs(false, function(err) { assert(!err); console.log("文件已保存到IDBFS"); }); }); ); emscripten_exit_with_live_runtime(); return 0; }
编译命令
emcc test.c -lidbfs.js -s FORCE_FILESYSTEM=1 --emrun -o test.html
关键问题解析
必须手动挂载IDBFS
IDBFS不会自动挂载,必须通过FS.mount(IDBFS, {}, '/mount_point')指定挂载目录,所有需要持久化的文件必须放在该目录下,否则只会存在于临时内存文件系统中。同步方向与异步时序
FS.syncfs(true, callback):从IndexedDB加载数据到内存,必须在写入前执行,确保挂载目录的初始状态正确FS.syncfs(false, callback):将内存数据同步到IndexedDB,写入操作完成后调用- 所有syncfs操作是异步的,必须等待回调执行完成,不能在main函数中直接同步后就退出,否则异步操作会被中断。
保持运行时存活
使用emscripten_exit_with_live_runtime()或编译选项-s NO_EXIT_RUNTIME=1,确保异步同步操作完成前,Emscripten运行时不会被关闭。
内容的提问来源于stack exchange,提问作者nightmareci
相关产品推荐
相关产品推荐

