如何从 HTML 输入加载文件到 Emscripten 的 MEMFS 文件系统?

How can I load a file from a HTML input into Emscripten's MEMFS file system?

我有一个 HTML 这样的输入 <input type="file" id="myfile" onchange="load_file()">。 我想将文件加载到 Emscripten 的 MEMFS 文件系统中。 查看 Emscripten file API 我一直在尝试使用 FS.mount() 来这样做。

然而,文档只给出了一个使用 WORKERFS 挂载的示例,所以我尝试这样玩弄它。

let files = document.getElementById('myfile').files;
let file=files[0];
FS.mount(MEMFS, {files: file },'test');
console.log(FS.readFile('test/' + file.name));

但是当我尝试读取文件时收到 "No such file or directory" 错误消息。

对我哪里出错有什么建议吗?

这是我最后做的事情–

input_test.html 文件输入:

<html>
    <body>
        <input type="file" id="myfile" onchange="load_file()"> 
    </body>
    <script type="text/javascript" src="auto_em.js"></script>
    <script type="text/javascript" src="input_test.js"></script>
</html>

input_test.js 然后将文件作为 ArrayBuffer 读取,然后使用该缓冲区的 Uint8Array 视图将文件写入 Emscripten 的 MEMFS:

let reader= new FileReader();

function load_file(){
    let files = document.getElementById('myfile').files;
    let file=files[0];
    reader.addEventListener('loadend', print_file);
    reader.readAsArrayBuffer(file);
}

function print_file(e){
    let result=reader.result;
    const uint8_view = new Uint8Array(result);

    FS.writeFile('write_test.txt', uint8_view)
    Module.ccall('print_file', 'number', ['string'], ['write_test.txt'])
}

print_input.cpp 打印文件以检查其是否有效:

#include <stdio.h>
extern "C" {

int print_file(char* file_path){

    FILE *file = fopen(file_path, "r");
    if (!file) {
        printf("cannot open file\n");
        return 1;
    }
    while (!feof(file)) {
        char c = fgetc(file);
        if (c != EOF) {
            putchar(c);
        }
    }
    return 0;
}
}

然后编译使用:

emcc print_input.cpp -o auto_em.js -s "EXPORTED_FUNCTIONS=['_print_file']" -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']" -s FORCE_FILESYSTEM=1