web-dev-qa-db-fra.com

Puis-je lire des fichiers à partir du disque à l'aide de Webassembly?

J'ai suivi le tutoriel de démarrage de Webassembly http://webassembly.org/getting-started/developers-guide/

Cela a bien fonctionné et affiché le "Bonjour, monde!" message dans le navigateur.

Ensuite, j'ai essayé un petit code C++, qui ouvre un fichier texte et fait le calcul (10 * 20) après avoir lu le fichier.

emcc a très bien compilé le fichier, aucune erreur.

Mais lorsque je sers le fichier via HTTP en exécutant emrun, il ne peut pas ouvrir le fichier.

Voici ce que je vois dans la console Web emrun:

Unable to open file
200

Existe-t-il des restrictions pour ouvrir des fichiers à partir du disque local?

    [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

Gardez la sécurité - WebAssembly est spécifié pour être exécuté dans un environnement d'exécution sécurisé et en bac à sable. Comme tout autre code Web, il appliquera les mêmes règles d'origine et d'autorisations du navigateur.

La réponse courte est donc - oui, il y a des restrictions. Vous n'avez pas accès aux fichiers sur les disques. Vous avez juste un bloc de mémoire, le code WASM pourrait être appelé à partir de JS et WASM pourrait également appeler des fonctions JS.

Mais, il y a une fonctionnalité intéressante dans Emscripten - dans le WASM, vous pouvez avoir votre propre système de fichiers "virtuel" avec des fichiers. Vous pouvez l'utiliser pour "attacher" certains fichiers const pendant la compilation et les lire au moment de l'exécution. Voir https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html

17
nzeemin

Vous pouvez empaqueter des fichiers ou des répertoires dans le système de fichiers virtuel WASM en utilisant le --embed-file drapeau.

Dans votre cas, cela ressemblerait à:

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

Documents: https://kripken.github.io/emscripten-site/docs/porting/files/packaging_files.html

6
Benjamin