Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何读取emscripten编译库中用户指定的文件?_C_Node.js_Filesystems_Emscripten - Fatal编程技术网

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

我目前正在使用C编写一个文件解析库,支持emscripten编译。它从用户那里获取一个文件路径,从中读取二进制文件并对其进行解析


我知道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的虚拟文件系统库,是否有办法使用您自己的虚拟文件系统库而不是提供的节点?