如何读取emscripten编译库中用户指定的文件?
我目前正在使用C编写一个文件解析库,支持emscripten编译。它从用户那里获取一个文件路径,从中读取二进制文件并对其进行解析如何读取emscripten编译库中用户指定的文件?,c,node.js,filesystems,emscripten,C,Node.js,Filesystems,Emscripten,我目前正在使用C编写一个文件解析库,支持emscripten编译。它从用户那里获取一个文件路径,从中读取二进制文件并对其进行解析 我知道emscripten不支持直接加载文件,而是使用虚拟文件系统。有没有办法将给定路径上的文件加载到虚拟文件系统中,以便emscripten编译的C库可以读取它?我正在为NodeJ和浏览器寻找解决方案。如果您想将此文件直接编译到库中,可以使用--preload file或--embed file选项。像这样: emcc main.cpp -o main.html -
我知道emscripten不支持直接加载文件,而是使用虚拟文件系统。有没有办法将给定路径上的文件加载到虚拟文件系统中,以便emscripten编译的C库可以读取它?我正在为NodeJ和浏览器寻找解决方案。如果您想将此文件直接编译到库中,可以使用--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,例如与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代码中并不是最好的方法,您可以直接在内存中传递数据。您也可以使用。请注意,它要求您在web worker中执行代码。如果要支持多个文件,可以使用用于存档的虚拟文件系统访问它们。这种方法的主要优点是,它将延迟加载,直到文件被实际读取。Emscripten,从今天(2016年6月)起,支持名为NODEFS
的文件系统,该文件系统在nodejs
上运行时提供对本地文件系统的访问
您需要手动将NODEFS
文件系统装入根文件系统。例如:
EM_ASM(
FS.mkdir('/working');
FS.mount(NODEFS, { root: '.' }, '/working');
);
然后,您可以通过虚拟路径从本地文件系统访问
/abc
,/working/abc
,如果您可以通过表单上传从您的网页提供文件,那么在收到文件上传“数据”后,您可以执行类似操作
请参阅如何实现这一点
您的问题的示例代码可能是:
// 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的详细说明,请参见
此解决方案适用于无法直接访问文件系统的浏览器如果您有一个实现节点fs api的虚拟文件系统库,是否有办法使用您自己的虚拟文件系统库而不是提供的节点?