【问题标题】:How do I read a user-specified file in an emscripten compiled library?如何在 emscripten 编译库中读取用户指定的文件?
【发布时间】:2014-07-22 17:38:19
【问题描述】:

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

我了解 emscripten 不支持直接加载文件,而是使用虚拟文件系统。有没有办法将给定路径的文件加载到虚拟文件系统中,以便 emscripten 编译的 C lib 可以读取它?我正在为 NodeJS 和浏览器寻找解决方案。

【问题讨论】:

    标签: c node.js filesystems emscripten


    【解决方案1】:

    如果您想将此文件直接编译到库中,您可以使用 --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 代码中也不是最好的方法,您可以直接在内存中传递数据,read about this

    【讨论】:

      【解决方案2】:

      您也可以使用synchronous virtual XHR backed file。请注意,它要求您在 Web Worker 中执行代码。如果您想支持多个文件,您可以使用虚拟文件系统来访问它们以进行存档。这种方法的主要优点是它将延迟加载,直到文件被实际读取。

      【讨论】:

        【解决方案3】:

        截至今天(2016 年 6 月),Emscripten 支持名为 NODEFS 的文件系统,当在 nodejs 上运行时,它可以访问本地文件系统。

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

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

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

        【讨论】:

        • 如果你有实现node的fs api的虚拟文件系统库,有没有办法使用你自己的虚拟文件系统库来代替提供的NODEFS?
        【解决方案4】:

        如果您可以通过网页上传的表单提供文件,那么在收到文件上传“数据”后,您可以执行类似的操作。

        请参阅here 了解如何实现这一点

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

        // 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的详细解释可以看here

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多