跨平台的C/C++程序常使用fopen()、fread()、fwrite()等Libc/LibCXX提供的同步文件访问函数。通常在文件系统方面,JavaScript程序与C/C++本地程序有巨大的差异,主要体现在:
- 运行在浏览器中的JavaScript程序无法访问本地文件系统;
- 在JavaScript中,无论ajax()还是fetch(),都是异步操作。
Emscripten提供了一套虚拟文件系统,以兼容Libc/LibCXX提供的同步文件访问函数。
在最底层,Emscripten提供了3种文件系统,分别为MEMFS(内存文件系统)、NODEFS、IDBFS。它们各自的特点:
- MEMFS系统的数据完全存储于内存中,程序运行时写入的数据在页面刷新或程序重载后将丢失;
- NODEFS是Node.js文件系统,可以访问本地文件系统,可以持久化存储数据,但只能用于Node.js环境。
- IDBFS是IndexedDB文件系统,是基于浏览器的IndexedDB对象,可以持久化存储数据,但只能用于浏览器环境。
一、基于MEMFS的打包文件系统
文件导入MEMFS系统之前,需要先将其打包。文件打包有两种方式:
- emcc命令:embed和preload。
- 单独的文件打包工具file_packager.py。
1、embed模式
文件数据被转为JavaScript代码&#x