Можно ли читать файлы с диска с помощью веб-сборки?

Я следовал инструкциям по началу работы с Webassembly http://webassembly.org/getting-started/developers-guide/

Он работал нормально и отображал «Привет, мир!» сообщение в браузере.

Затем я попробовал небольшой код C ++, который открывает текстовый файл и выполняет вычисления (10 * 20) после прочтения файла.

emcc скомпилировал файл просто отлично, ошибок нет.

Но когда я передаю файл по HTTP, запустив emrun, он не может открыть файл.

Вот что я вижу в веб-консоли 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 .

11

Решение

Хранить в безопасности — WebAssembly предназначена для запуска в безопасной изолированной среде
среда исполнения. Как и другой веб-код, он будет обеспечивать
Политики браузера того же происхождения и разрешений.

Таким образом, короткий ответ — да, есть ограничения. У вас нет доступа к файлам на дисках. У вас просто есть блок памяти, код WASM может быть вызван из JS, а также WASM может вызывать функции JS.

Но есть одна интересная особенность в Emscripten — в WASM вы можете иметь свою собственную «виртуальную» файловую систему с файлами. Вы можете использовать его для «прикрепления» некоторых const-файлов во время компиляции и чтения их во время выполнения.
Увидеть https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html

13

Другие решения

Вы можете упаковать файлы или каталоги в виртуальную файловую систему WASM, используя --embed-file флаг.

В вашем случае это будет выглядеть так:

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

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

4

По вопросам рекламы [email protected]