You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:15:01