如何读取emscripten编译库中的用户指定文件?

我目前正在使用emscripten编译支持C中的文件parsing库。 它从读取二进制文件的用户处获取文件path并对其进行parsing。

我知道emscripten不支持直接加载文件,而是使用虚拟文件系统。 有没有办法将文件加载到虚拟文件系统的给定path,以便emscripten编译的C库可以读取它? 我在寻找NodeJS和浏览器的解决scheme。

如果你想直接把这个文件编译到库中,你可以使用–preload-file或–embed-file选项。 喜欢这个:

emcc main.cpp -o main.html --preload-file /tmp/my@/home/caiiiycuk/test.file 

在C之后,你可以正常打开这个文件:

 fopen("/home/caiiiycuk/test.file", "rb") 

或者你可以使用emscripten javascript fs-api ,例如ajax:

 $.ajax({ url: "/dataurl", type: 'GET', beforeSend: function (xhr) { xhr.overrideMimeType("text/plain; charset=x-user-defined"); }, success: function( data ) { Module['FS_createDataFile']("/tmp", "test.file", data, true, true); } }); 

之后,你可以从C中打开这个文件。也不是传递数据到C代码的最好方法,你可以直接在内存中传递数据, 阅读这个 。

如果您可以通过从您的网页上载表单提供文件,那么在接收file upload“数据”时,您可以做这样的事情。

请参阅这里如何实现这一点

示例代码为您的问题可能是:

 // Assuming data contains the base64 encoded fileData, // you want the file to be present at "." location with name as myFileName Module['FS_createDataFile'](".", myFileName, atob(data), true, true); 

所使用的API的详细说明可以在这里find

此解决scheme适用于您无法直接访问文件系统的浏览器

您也可以使用同步虚拟XHR支持的文件 。 请注意,它要求您在networking工作者中执行您的代码。 如果要支持多个文件,则可以使用虚拟文件系统访问它们以存档。 这种方法的主要优点是它会推迟加载直到文件被实际读取。

截至今天(2016年6月),Emscripten支持一个名为NODEFS的文件系统,该文件系统在nodejs运行时提供对本地文件系统的nodejs

您需要手动将NODEFS文件系统挂载到根文件系统中。 例如:

 EM_ASM( FS.mkdir('/working'); FS.mount(NODEFS, { root: '.' }, '/working'); ); 

然后可以通过虚拟path/working/abc从本地文件系统访问./abc