智慧小程式檔案館——檔案系統能力

百度智慧小程式學院發表於2018-11-16

隨著小遊戲的應運而生,我們在小程式原有的能力基礎之上,對檔案系統能力做了進一步擴充,今天我們將詳細為您介紹一下——檔案系統能力。

檔案系統介紹

小遊戲的出現,對檔案系統能力提出了更高的要求,因此我們在小程式的檔案能力基礎上進行了如下擴充套件:

新增介面

新增了目錄管理檔案操作等介面,將這些能力封裝成檔案系統。

提升儲存能量

檔案系統為開發者提供了更加完善的能力來支撐小遊戲中複雜的檔案目錄結構和檔案讀寫操作,並且每個小遊戲的本地使用者檔案儲存容量提升到了50M。

提供使用者資源隔離機制

為保證使用者之間和小遊戲小程式之間的資源資訊不被盜取或篡改,檔案系統還提供了一套使用者資源隔離機制,來避免登入使用者之間的檔案內容會互相影響,和保護資訊資源的安全。

檔案型別

圖片

本地臨時檔案

主要由 swan.downloadFile() 等特定API執行產生,這些特定的API會返回一個臨時的檔案地址,該地址只能在當前遊戲的生命週期內使用,在遊戲銷燬後該臨時地址和本地臨時檔案會被清除。使用者只有可讀檔案許可權,這類檔案無法直接呼叫檔案系統的API對本地臨時檔案執行寫入操作,最大儲存為25M 。

示例:

```
swan.downloadFile({
    url: 'https://smartprogram.baidu.com/docs/img/logo.png',
    success: res => {
        console.log(res.tempFilePath);  // 返回本地臨時檔案路徑 bdfile://tmp/1542099788398.png
    },
    fail: err => {
        console.log(err);
    }
})
```
複製程式碼

本地使用者檔案

主要由檔案系統API操作產生,包括:資料夾操作、檔案讀寫操作、本地臨時檔案的儲存等,通過 swan.env.USER_DATA_PATH 可以獲取到這個目錄的路徑。使用者擁有可讀可寫許可權。這類檔案在退出遊戲後資料不會被清除,可持久化儲存檔案,最大儲存為50M。

示例:
```
fileSystemManager.writeFileSync(
	`${swan.env.USER_DATA_PATH}/demo.txt`,
    'hello',
    'utf8'
);
```
複製程式碼

程式碼包/本地包檔案:

存在程式碼包中的檔案。使用者只可讀,不可寫入。 程式碼包檔案的訪問方式是從專案根目錄開始寫檔案路徑,不需要帶訪問協議字首。 如: loading/loading_barbg.png

圖片

示例:

```
let data = fileSystemManager.readFileSync(
	`loading/loading_barbg.png`,
    'utf8'
);
```
複製程式碼
  • 本地檔案的檔案路徑結構均為: {{協議名}}://檔案路徑
  • 檔案系統不支援相對路徑 ./../
  • 開發者不可訪問本地臨時檔案程式碼包檔案本地使用者檔案父級目錄或更高層目錄,均會被拒絕。
  • 與微信不同:設計中不支援本地快取檔案

生命週期:

  • 當退出當前遊戲、後臺執行遊戲至5分鐘、殺死百度app程式時,會清除當前使用者遊戲的本地臨時檔案
  • 當遊戲從列表中刪除時,會清除當前使用者被刪除遊戲的所有檔案(包含:程式碼包檔案本地臨時檔案本地使用者檔案)。

檔案管理介面

通過 swan.getFileSystemManager()可以獲取全域性唯一的檔案管理器物件: fileSystemManager ,呼叫 fileSystemManager 物件上的方法來實現對檔案的操作。

const fileSystemManager = swan.getFileSystemManager();
複製程式碼

場景示例:

  1. 使用 swan.downloadFile()fileSystemManager.saveFile() 方法,將下載的本地臨時檔案儲存到本地使用者檔案

    const fileSystemManager = swan.getFileSystemManager();
    swan.downloadFile({
        url: 'https://smartprogram.baidu.com/docs/img/logo.png',
        success: res => {
            console.log(res.tempFilePath);  // 返回本地臨時檔案路徑
            // bdfile://tmp/1542099788398.png
            fileSystemManager.saveFile({
                tempFilePath: res.tempFilePath, // 傳入本地臨時檔案路徑
                success: res => {
                    // 儲存後的檔案路徑
                    console.log(res.savedFilePath); 
                    // bdfile://usr/1542099788398.png
                },
    
                fail: err => {
                    console.log('介面執行失敗', err.errMsg);
                },
                complete: res => {
    				console.log('介面執行完成');
    			}
            });
        },
        fail: err => {
            console.log(err);
        }
    })
    複製程式碼
  2. 將遊戲關卡資料寫入到本地使用者檔案中。

    const fileSystemManager = swan.getFileSystemManager();
    fileSystemManager.writeFile({
        filePath: `${swan.env.USER_DATA_PATH}/gameLevel.txt`,   // 傳入本地使用者檔案路徑
        data: '{"level": 3}',
        success: res => {
            // 寫入成功。
            console.log(res);
            fileSystemManager.readFile({
                filePath: `${swan.env.USER_DATA_PATH}/gameLevel.txt`,
                encoding: 'utf8',
                success: res => {
                    console.log(JSON.parse(res.data));
                    // res.data 中為 string,檔案內容: {level: 3}
                },
                fail: res => {
                    // res.errMsg 為失敗資訊。
                },
                complete: () => {
                    // 介面執行完成
                }
            });
        },
        fail: res => {
            // res.errMsg 為失敗資訊。
            console.log(res)
        },
        complete: () => {
            // 介面執行完成
            console.log('介面執行完成')
        }
    });
    複製程式碼
  3. 讀取程式碼包檔案。

    const fileSystemManager = swan.getFileSystemManager();
    fileSystemManager.readFile({
        filePath: 'game.json',
        encoding: 'utf8',
        success: res => {
            console.log(res);
        },
        fail: res => {
            console.log(res);
        },
        complete: () => {
            // 介面執行完成
        }
    });
    複製程式碼

使用者資源隔離

在百度App登入之後,訪問小遊戲或小程式時,不同使用者的檔案會被儲存到本地,以百度賬號將檔案(包含:程式碼包檔案本地臨時檔案本地使用者檔案)隔離。每個使用者下的所有小程式或者小遊戲都是相互隔離的。遊戲之間和使用者之間,遊戲資源都不會被互相訪問到。這樣既保證了使用者的資訊不會被其他賬號訪問到,又保證了每個小遊戲小程式的資料安全性。

圖片

由於百度和微信的登入體系不同,智慧小程式和小遊戲在不登入的情況下也可以開啟。

如果您的小程式或小遊需要使用者登入才可以使用戲,一定要注意使用者資源隔離系統。在未登入前下載的遊戲資源會和登入之後的資源隔離。所以保證使用者等登入狀態非常重要

相關文章