1. 程式人生 > >智慧小程式檔案館——檔案系統能力

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

新增介面

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

提升儲存能量

檔案系統為開發者提供了更加完善的能力來支撐小遊戲中複雜的檔案目錄結構和檔案讀寫操作,並且每個小遊戲的 本地使用者檔案 儲存容量提升到了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);
        }
    })

    將遊戲關卡資料寫入到 本地使用者檔案 中。

    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('介面執行完成')
        }
    });
    複製程式碼
    讀取程式碼包檔案。
    
    const fileSystemManager = swan.getFileSystemManager();
    fileSystemManager.readFile({
        filePath: 'game.json',
        encoding: 'utf8',
        success: res => {
            console.log(res);
        },
        fail: res => {
            console.log(res);
        },
        complete: () => {
            // 介面執行完成
        }
    });

    使用者資源隔離

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