我能否使用Webassembly从磁盘读取文件?

31

我遵循了Webassembly入门教程http://webassembly.org/getting-started/developers-guide/

一切都运行良好,浏览器中显示了“Hello, world!”消息。

然后我尝试了一段小的C++代码,它打开一个文本文件,在读取文件后进行计算(10 * 20)。

emcc编译文件没有错误。

但是当我通过运行emrun将文件通过HTTP服务时,它无法打开文件。

这是我在emrun网络控制台中看到的内容:

Unable to open file
200

本地磁盘中的文件是否受到任何限制?

    [thiago@terra hello]$ cat pfile.cpp 
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;

    int main() {
     string line;
     int a, b, c;
     ifstream myfile("test.txt");
     if (myfile.is_open()) {
      while (getline (myfile, line)) {
       cout << line << endl;
      }
      myfile.close();
     }
     else cout << "Unable to open file" << endl;
     a = 10;
     b = 20;
     c = a * b;
     cout << c << endl;
     return 0;
    }

    [thiago@terra hello]$ emcc pfile.cpp -s WASM=1 -o pfile.html -v                                                               
INFO:root:(Emscripten: Running sanity checks)                                                                                     
clang version 4.0.0 (https://github.com/kripken/emscripten-fastcomp-clang.git c7c210fee24e0227f882337521b25b1ed9c36d5b) (https://github.com/kripken/emscripten-fastcomp.git 90b726ede4acf47c1bca089de6c79a0b8f2c5d9a) (emscripten 1.37.18 : 1.37.18)                                                         
Target: asmjs-unknown-emscripten
Thread model: posix
InstalledDir: /home/thiago/Downloads/emsdk/clang/fastcomp/build_incoming_64/bin
 "/home/thiago/Downloads/emsdk/clang/fastcomp/build_incoming_64/bin/clang-4.0" -cc1 -triple asmjs-unknown-emscripten -emit-llvm-bc -emit-llvm-uselists -disable-free -main-file-name pfile.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -no-integrated-as -mconstructor-aliases -v -dwarf-column-info -debugger-tuning=gdb -coverage-notes-file /tmp/tmpV3VHOz/pfile_0.gcno -nostdsysteminc -nobuiltininc -resource-dir /home/thiago/Downloads/emsdk/clang/fastcomp/build_incoming_64/bin/../lib/clang/4.0.0 -D __EMSCRIPTEN_major__=1 -D __EMSCRIPTEN_minor__=37 -D __EMSCRIPTEN_tiny__=18 -D _LIBCPP_ABI_VERSION=2 -Werror=implicit-function-declaration -std=c++03 -fdeprecated-macro -fno-dwarf-directory-asm -fdebug-compilation-dir /home/thiago/hello -ferror-limit 19 -fmessage-length 164 -fobjc-runtime=gnustep -fcxx-exceptions -fexceptions -fdiagnostics-show-option -nobuiltininc -nostdsysteminc -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/include/libcxx -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/lib/libcxxabi/include -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/include/compat -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/include -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/include/SSE -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/include/libc -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/lib/libc/musl/arch/emscripten -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/local/include -isystem/home/thiago/Downloads/emsdk/emscripten/incoming/system/include/SDL -o /tmp/tmpV3VHOz/pfile_0.o -x c++ pfile.cpp
clang -cc1 version 4.0.0 based upon LLVM 4.0.0 default target x86_64-unknown-linux-gnu
#include "..." search starts here:
#include <...> search starts here:
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/include/libcxx
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/lib/libcxxabi/include
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/include/compat
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/include
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/include/SSE
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/include/libc
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/lib/libc/musl/arch/emscripten
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/local/include
 /home/thiago/Downloads/emsdk/emscripten/incoming/system/include/SDL
End of search list.
[thiago@terra hello]$ emrun --no_browser --port 8080 .

6
当然会有限制。如果没有任何限制,那么WebAssembly将成为一个巨大的安全漏洞。 - Mike Nakis
2
你有没有找到解决方案? - Sandeep Ks
2个回答

20
保持安全 - WebAssembly被指定为在安全的沙盒执行环境中运行。与其他Web代码一样,它将强制执行浏览器的同源和权限策略。
所以简短的答案是 - 是的,有限制。您无法访问磁盘上的文件。您只有一块内存块,WASM代码可以从JS调用,WASM也可以调用JS函数。
但是,在Emscripten中有一个有趣的特性 - 在WASM中,您可以拥有自己的“虚拟”文件系统,其中包含文件。您可以在编译时使用它来“附加”一些常量文件,并在执行时读取它们。 请参见https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html

4
请问,“虚拟”文件系统是什么意思?它是在内存(RAM)中还是在本地的沙盒浏览器磁盘空间中?即它们是真正的“文件”还是只是表现为文件的对象。如果文件大小为10 GB,那么它是否能在不影响内存的情况下存储? - iammilind
@iammilind 对于文件系统访问,你可以使用MEMDB,它只是一个内存,还有IDBFS,它是一种持久化存储。抱歉,我不知道文件大小限制等深层细节。 - nzeemin

12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接