Dateisystem-Übersicht

Die folgenden Abschnitte bieten einen kurzen Überblick über die Emscripten-Dateisystemumgebung und Architektur. Neben der Erörterung der Unterstützung für Standard-C/C++-synchronous-Datei-APIs wird kurz die Dateisystem-API und Emscriptens Asynchrone Dateisystem-API besprochen.

Emscripten-Dateisystem-Laufzeitumgebung

Nativer Code und „normales“ JavaScript verwenden ziemlich unterschiedliche Paradigmen für den Dateizugriff. Portabler nativer Code ruft normalerweise synchrone Datei-APIs in libc und libcxx auf, während JavaScript nur asynchronen Dateizugriff erlaubt (außer in Web-Workern). Darüber hinaus hat JavaScript keinen direkten Zugriff auf das Host-Dateisystem, wenn es in der Sandbox-Umgebung eines Webbrowsers ausgeführt wird.

Emscripten bietet ein virtuelles Dateisystem, das das lokale Dateisystem simuliert, sodass nativer Code, der synchrone Datei-APIs verwendet, mit geringen oder keinen Änderungen kompiliert und ausgeführt werden kann.

Dateien verpacken erklärt, wie Sie emcc verwenden können, um anzugeben, welche Dateien Sie in das Dateisystem aufnehmen müssen. Für viele Entwickler mag das alles sein, was Sie tun müssen.

Emscripten-Dateisystemarchitektur

Die Hauptelemente der Emscripten-Dateisystemarchitektur sind unten dargestellt. Die meisten nativen Codes rufen die synchronen Datei-APIs in libc und libcxx auf. Diese wiederum rufen die zugrunde liegende Dateisystem-API auf, die standardmäßig das virtuelle Dateisystem MEMFS verwendet.

File System Architecture

MEMFS wird bei der Initialisierung der Laufzeitumgebung unter / gemountet. Dateien, die dem virtuellen Dateisystem MEMFS hinzugefügt werden sollen, werden zur Kompilierungszeit mit emcc angegeben, wie in Dateien verpacken besprochen. Die Dateien werden asynchron von JavaScript mithilfe von synchronen XHRs geladen, wenn die Seite zum ersten Mal geladen wird. Der kompilierte Code darf nur ausgeführt werden (und synchrone APIs aufrufen), wenn der asynchrone Download abgeschlossen ist und die Dateien im virtuellen Dateisystem verfügbar sind.

Mit MEMFS existieren alle Dateien streng im Arbeitsspeicher, und alle darauf geschriebenen Daten gehen verloren, wenn die Seite neu geladen wird. Wenn persistente Daten erforderlich sind, können Sie das Dateisystem IDBFS in einem Browser oder NODEFS auf node.js mounten. NODEFS bietet direkten Zugriff auf das lokale Dateisystem, aber nur, wenn es in node.js ausgeführt wird. Sie können die Dateisystem-API direkt von Ihrem eigenen JavaScript aus aufrufen, um neue Dateisysteme zu mounten und andere synchrone Dateisystemoperationen durchzuführen, die erforderlich sein könnten. Weitere Informationen zu diesem Thema finden Sie unter Dateisysteme.

Wenn Sie weitere Dateien aus dem Netzwerk in das Dateisystem laden müssen, verwenden Sie emscripten_wget() und die anderen Methoden in der Asynchronen Dateisystem-API. Diese Methoden sind asynchron, und die Anwendung muss warten, bis der registrierte Callback abgeschlossen ist, bevor versucht wird, sie zu lesen.