Skip to content

文件系統

檔案系統是小遊戲提供的一套以小遊戲和用戶維度隔離的儲存以及一套相應的管理介面。透過wx.getFileSystemManager()可以取得到全域唯一的檔案系統管理器,所有檔案系統的管理操作透過FileSystemManager來調用。

js
var fs = wx.getFileSystemManager();

文件主要分為兩大類:

  • 代碼包文件:代碼包文件指的是在項目目錄中添加的文件。
  • 本地文件:通過調用接口本地產生,或通過網絡下載下來,存儲到本地的文件

其中本地文件又分為三種:

  • 本地暫存文件:臨時產生,隨時會被回收的文件運行時最多存儲4GB,結束運行後,如果已使用超過2GB,會以文件為維度按照最近使用時間從遠到近進行清理至少於2GB。
  • 本地緩存文件:小程序通過接口把本地暫存文件緩存後產生的文件,不能自定義目錄和檔名跟本地用戶文件共計,小程序(含小遊戲)最多可存儲200MB。
  • 本地用戶文件:小程序通過接口把本地暫存文件緩存後產生的文件,允許自定義目錄和檔名跟本地緩存文件共計,小程序(含小遊戲)最多可存儲200MB。

代碼包文件

由於代碼包文件大小限制,代碼包文件適用於放置首次加載時需要的文件,對於內容較大或需要動態替換的文件,不推到代碼包中,推薦在小程序啟動之後再用下載接口下載到本地。

訪問代碼包文件

代碼包文件的訪問管道是從項目根目錄開始寫文件路徑,不支持相對路徑的寫法如:/ a/b/c、a/b/c都是合法的,./ a/b/c、../a/b/c則不合法。

修改代碼包文件

代碼包內的文件無法在運行後動態修改或删除,修改代碼包文件需要重新發佈版本。

本地文件

本地文件指的是小程序被用戶添加到手機後,會有一塊獨立的檔存儲區域,以用戶維度隔離即同一臺手機,每個用戶不能訪問到其他登入用戶的文件,同一個用戶不同appId之間的文件也不能互相訪問。

本地文件的文件路徑均為以下格式:

js
{{protocol name}}://file path

TIP

其中,協定名在iOS/Android用戶端為'wxfile',在開發者工具上為'http',開發者無需關注這個差异,也不應在代碼中去硬編碼完整文件路徑。

本地暫存文件

本地暫存文件只能通過調用特定接口產生,不能直接寫入內容本地暫存文件產生後,僅在當前生命週期內保證有效,重啓之後不一定可用如果需要保證在下次啟動時無需下載,可通過FileSystemManager.saveFile()FileSystemManager.copyFile()接口把本地暫存文件轉換成本地緩存文件或本地用戶文件。

代碼示例:

js
wx.chooseImage({
  success: function (res) {
    var tempFilePaths = res.tempFilePaths; // each entry in tempFilePaths is a local temp file path
  },
});

本地緩存文件

本地緩存文件只能通過調用特定接口產生,不能直接寫入內容本地緩存文件產生後,重啓之後仍可用本地緩存文件只能通過FileSystemManager.saveFile()介面將本地暫存文件保存獲得。

代碼示例:

js
fs.saveFile({
  tempFilePath: "", // Pass in a local temporary file path
  success(res) {
    console.log(res.savedFilePath); // res.savedFilePath is a local cache file path
  },
});

本地用戶文件

我們提供了一個用戶文件目錄給開發者,開發者對這個目錄有完全自由的讀寫許可權通過wx.env. USER_DATA_PATH可以獲取到這個目錄的路徑。

代碼示例:

js
// Create a file hello.txt in the local user file directory and write "hello, world" to it
const fs = wx.getFileSystemManager();
fs.writeFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, "hello, world", "utf8");

讀寫許可權

接口、組件
代碼包文件
本地暫存文件
本地緩存文件
本地用戶文件

清理策略

  • 本地暫存文件只保證在小程序當前生命週期內,一旦小程序被關閉就可能被清理,即下次冷開機不保證可用。
  • 本地緩存文件和本地用戶文件的清理時機跟代碼包一樣,只有在代碼包被清理的時候才會一同被清理。