以下章節簡要概述了 Emscripten 檔案系統環境和架構。除了討論對標準 C/C++ 同步檔案 API 的支援外,它還簡要討論了檔案系統 API和 Emscripten 的 非同步檔案系統 API。
原生程式碼和「一般」JavaScript 使用非常不同的檔案存取範例。可攜式原生程式碼通常會呼叫 libc 和 libcxx 中的同步檔案 API,而 JavaScript 只允許非同步檔案存取 (除了在 Web Worker 中)。此外,當在網頁瀏覽器提供的沙箱環境中執行時,JavaScript 無法直接存取主機檔案系統。
Emscripten 提供一個模擬本機檔案系統的虛擬檔案系統,以便可以使用同步檔案 API 的原生程式碼可以經過少量或不經過任何變更即可編譯和執行。
封裝檔案說明如何使用 emcc 來指定您需要包含在檔案系統中的檔案。對於許多開發人員來說,這可能就是您需要做的全部。
Emscripten 檔案系統架構的主要元素如下所示。大多數原生程式碼會呼叫 libc 和 libcxx 中的同步檔案 API。這些反過來會呼叫底層的 檔案系統 API,預設會使用 MEMFS 虛擬檔案系統。
當初始化執行階段時,MEMFS
會掛載在 /
。使用 emcc 在編譯時指定要新增到 MEMFS 虛擬檔案系統的檔案,如 封裝檔案 中所述。當首次載入頁面時,JavaScript 會使用 同步 XHR 以非同步方式載入檔案。只有在非同步下載完成且檔案在虛擬檔案系統中可用時,才允許編譯後的程式碼執行 (和呼叫同步 API)。
使用 MEMFS
時,所有檔案都嚴格存在於記憶體中,並且當頁面重新載入時,寫入其中的任何資料都會遺失。如果需要持續性資料,您可以在瀏覽器中掛載 IDBFS 檔案系統,或在 node.js 上掛載 NODEFS。NODEFS 提供對本機檔案系統的直接存取,但僅限於在 node.js 內部執行時。您可以從您自己的 JavaScript 直接呼叫 檔案系統 API,以掛載新的檔案系統,並執行可能需要的其他同步檔案系統操作。在 檔案系統 中有更多關於此主題的資訊。
如果您需要從網路提取其他檔案到檔案系統,則使用 emscripten_wget()
和非同步檔案系統 API 中的其他方法。這些方法是非同步的,應用程式必須等待註冊的回呼完成後,才能嘗試讀取它們。