以下のセクションでは、Emscriptenファイルシステム環境とアーキテクチャの概要を簡単に説明します。標準的なC/C++同期ファイルAPIのサポートについて説明するだけでなく、ファイルシステムAPIとEmscriptenの非同期ファイルシステムAPIについても簡単に説明します。
ネイティブコードと「通常の」JavaScriptでは、ファイルアクセスパラダイムがかなり異なります。ポータブルなネイティブコードは通常、**libc**と**libcxx**で*同期*ファイルAPIを呼び出すのに対し、JavaScriptでは*非同期*ファイルアクセスのみが許可されます(Webワーカー内を除く)。さらに、JavaScriptは、Webブラウザによって提供されるサンドボックス環境内で実行される場合、ホストファイルシステムに直接アクセスできません。
Emscriptenは、同期ファイルAPIを使用するネイティブコードをほとんどまたはまったく変更せずにコンパイルして実行できるように、仮想ファイルシステムを提供します。
ファイルのパッケージ化では、emccを使用してファイルシステムに含める必要のあるファイルを指定する方法について説明します。多くの開発者にとって、これだけですべて済む場合があります。
Emscriptenファイルシステムアーキテクチャの主な要素を以下に示します。ほとんどのネイティブコードは、**libc**と**libcxx**の*同期*ファイルAPIを呼び出します。これらは、基盤となるファイルシステムAPIを呼び出し、デフォルトではMEMFS仮想ファイルシステムを使用します。
MEMFS
は、ランタイムの初期化時に/
にマウントされます。ファイルのパッケージ化で説明されているように、MEMFS仮想ファイルシステムに追加するファイルは、emccを使用してコンパイル時に指定されます。ファイルは、ページが最初にロードされたときに、同期XHRを使用してJavaScriptによって非同期的にロードされます。コンパイルされたコードは、非同期ダウンロードが完了し、ファイルが仮想ファイルシステムで使用可能になった場合にのみ実行(および同期APIを呼び出す)が許可されます。
MEMFS
を使用すると、すべてのファイルはメモリ内に厳密に存在し、それらに書き込まれたデータはページがリロードされると失われます。永続的なデータが必要な場合は、ブラウザでIDBFSファイルシステム、またはnode.jsでNODEFSをマウントできます。NODEFSは、ローカルファイルシステムへの直接アクセスを提供しますが、node.js内で実行されている場合のみです。独自のJavaScriptからファイルシステムAPIを直接呼び出して、新しいファイルシステムをマウントしたり、必要になる可能性のある他の同期ファイルシステム操作を実行したりできます。このトピックに関する詳細については、ファイルシステムを参照してください。
ネットワークからファイルシステムに他のファイルをフェッチする必要がある場合は、emscripten_wget()
と非同期ファイルシステムAPIの他のメソッドを使用します。これらのメソッドは非同期であり、アプリケーションは登録されたコールバックが完了するまで待機してから読み取ろうとする必要があります。