檔案系統概述

以下章節簡要概述了 Emscripten 檔案系統環境架構。除了討論對標準 C/C++ 同步檔案 API 的支援外,它還簡要討論了檔案系統 API和 Emscripten 的 非同步檔案系統 API

Emscripten 檔案系統執行階段環境

原生程式碼和「一般」JavaScript 使用非常不同的檔案存取範例。可攜式原生程式碼通常會呼叫 libclibcxx 中的同步檔案 API,而 JavaScript 只允許非同步檔案存取 (除了在 Web Worker 中)。此外,當在網頁瀏覽器提供的沙箱環境中執行時,JavaScript 無法直接存取主機檔案系統。

Emscripten 提供一個模擬本機檔案系統的虛擬檔案系統,以便可以使用同步檔案 API 的原生程式碼可以經過少量或不經過任何變更即可編譯和執行。

封裝檔案說明如何使用 emcc 來指定您需要包含在檔案系統中的檔案。對於許多開發人員來說,這可能就是您需要做的全部。

Emscripten 檔案系統架構

Emscripten 檔案系統架構的主要元素如下所示。大多數原生程式碼會呼叫 libclibcxx 中的同步檔案 API。這些反過來會呼叫底層的 檔案系統 API,預設會使用 MEMFS 虛擬檔案系統。

File System Architecture

當初始化執行階段時,MEMFS 會掛載在 /。使用 emcc 在編譯時指定要新增到 MEMFS 虛擬檔案系統的檔案,如 封裝檔案 中所述。當首次載入頁面時,JavaScript 會使用 同步 XHR 以非同步方式載入檔案。只有在非同步下載完成且檔案在虛擬檔案系統中可用時,才允許編譯後的程式碼執行 (和呼叫同步 API)。

使用 MEMFS 時,所有檔案都嚴格存在於記憶體中,並且當頁面重新載入時,寫入其中的任何資料都會遺失。如果需要持續性資料,您可以在瀏覽器中掛載 IDBFS 檔案系統,或在 node.js 上掛載 NODEFSNODEFS 提供對本機檔案系統的直接存取,但僅限於在 node.js 內部執行時。您可以從您自己的 JavaScript 直接呼叫 檔案系統 API,以掛載新的檔案系統,並執行可能需要的其他同步檔案系統操作。在 檔案系統 中有更多關於此主題的資訊。

如果您需要從網路提取其他檔案到檔案系統,則使用 emscripten_wget()非同步檔案系統 API 中的其他方法。這些方法是非同步的,應用程式必須等待註冊的回呼完成後,才能嘗試讀取它們。