web-dev-qa-db-ja.com

Webassemblyを使用してディスクからファイルを読み取ることはできますか?

Webassembly入門チュートリアルに従いました http://webassembly.org/getting-started/developers-guide/

正常に機能し、「Hello、world!」と表示されました。ブラウザのメッセージ。

次に、テキストファイルを開き、ファイルを読み取った後に計算(10 * 20)を実行する小さなC++コードを試しました。

emccはファイルを問題なくコンパイルし、エラーは発生しませんでした。

しかし、emrunを実行してHTTP経由でファイルを提供すると、ファイルを開くことができません。

これは、emrun Webコンソールに表示されるものです。

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 .
17
Thiago Silvino

安全に保つ— WebAssemblyは、安全なサンドボックス化された実行環境で実行するように指定されています。他のWebコードと同様に、ブラウザーの同一生成元およびアクセス許可ポリシーを適用します。

簡単な答えは-はい、制限があります。ディスク上のファイルにアクセスできません。メモリのブロックがあるだけで、WASMコードはJSから呼び出すことができ、WASMはJS関数を呼び出すこともできます。

しかし、Emscriptenには興味深い機能が1つあります。WASMでは、ファイルを使用して独自の「仮想」ファイルシステムを作成できます。これを使用して、コンパイル時にいくつかのconstファイルを「添付」し、実行時に読み取ることができます。 https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html を参照してください

17
nzeemin

--embed-fileフラグを使用して、ファイルまたはディレクトリをWASM仮想ファイルシステムにパッケージ化できます。

あなたの場合、これは次のようになります。

emcc pfile.cpp -s WASM=1 -o pfile.html -v --embed-file test.txt

ドキュメント: https://kripken.github.io/emscripten-site/docs/porting/files/packaging_files.html

6
Benjamin