如何让Emscripten编译的程序将文件写入宿主文件系统?
Emscripten + Node.js 实现文件保存到宿主系统
Emscripten默认使用内存中的虚拟文件系统,你用std::ofstream写入的log.txt只存在于Wasm的虚拟环境里,不会自动同步到宿主系统。下面提供两种可行的实现方案:
方案一:直接调用Node.js的fs模块(推荐)
通过Emscripten的EM_ASM宏在C++代码中调用Node.js的文件系统API,显式将虚拟文件写入宿主目录。
修改后的main.cpp
#include <fstream> #include <emscripten.h> int main() { // 写入虚拟文件系统 std::ofstream os("log.txt", std::ios::trunc); os << "a"; os.close(); // 必须关闭文件确保内容写入虚拟FS // 调用Node.js的fs模块同步文件到宿主 EM_ASM({ const fs = require('fs'); const path = require('path'); // 从虚拟FS读取文件内容 const fileContent = FS.readFile('log.txt', { encoding: 'utf8' }); // 写入宿主当前目录的log.txt fs.writeFileSync(path.join(process.cwd(), 'log.txt'), fileContent); }); }
编译命令
需要导出Emscripten的FS运行时方法,让JS代码能访问虚拟文件系统:
em++ main.cpp -s EXPORTED_RUNTIME_METHODS='["FS"]' -o a.out.js
执行命令
node a.out.js
执行后宿主当前目录会生成log.txt文件。
方案二:使用Emscripten文件系统同步函数
利用Emscripten提供的emscripten_sync_fs函数,将虚拟文件系统的内容同步到宿主挂载的目录。
修改后的main.cpp
#include <fstream> #include <emscripten.h> #include <emscripten/fs.h> int main() { std::ofstream os("log.txt", std::ios::trunc); os << "a"; os.close(); // 同步虚拟FS的根目录到宿主系统 emscripten_sync_fs(EMSCRIPTEN_SYNC_FS_PERSIST, "/", nullptr, nullptr); }
编译命令
启用持久化文件系统并导出必要的运行时方法:
em++ main.cpp -s EXPORTED_RUNTIME_METHODS='["FS"]' -s PERSISTENT_FILESYSTEM=1 -o a.out.js
执行命令
运行时将虚拟FS的根目录挂载到宿主当前目录:
node a.out.js --mount /:.
注意事项
- 必须确保
std::ofstream调用close(),否则虚拟文件系统中可能没有完整的文件内容。 - Node.js环境下无需额外配置跨域权限,直接可以访问本地文件系统。
内容的提问来源于stack exchange,提问作者jjcasmar
相关产品推荐
相关产品推荐

