如何读取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
。