石家莊個(gè)人誰(shuí)做網(wǎng)站廈門(mén)百度關(guān)鍵詞推廣
【HarmonyOS】鴻蒙將資源文件夾Resource-RawFile下的文件存放到沙箱目錄下
一、問(wèn)題背景
應(yīng)用開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到一些文件原先是放在資源文件夾 rawfile下,但是邏輯處理時(shí),需要轉(zhuǎn)移到本地沙箱才能操作。這種情況下,就需要將將資源文件夾Resource-RawFile下的文件存放到沙箱目錄下。
二、鴻蒙資源文件和沙箱的概念
在鴻蒙中,應(yīng)用僅能保存文件到“應(yīng)用文件目錄”下,根據(jù)目錄的使用規(guī)范和注意事項(xiàng)來(lái)選擇將數(shù)據(jù)保存到不同的子目錄中。
這樣的設(shè)定與安卓和蘋(píng)果目前一致。應(yīng)用沙箱的概念,可以保證數(shù)據(jù)訪問(wèn)的安全性。
在鴻蒙系統(tǒng)中,文件存儲(chǔ)分為不同的域,如應(yīng)用內(nèi)部存儲(chǔ)(應(yīng)用私有目錄)和外部存儲(chǔ)(公共目錄等)。應(yīng)用內(nèi)部存儲(chǔ)是應(yīng)用私有的,其他應(yīng)用通常無(wú)法訪問(wèn)。外部存儲(chǔ)可以在用戶(hù)授權(quán)的情況下被多個(gè)應(yīng)用訪問(wèn)。
注意:
不要使用絕對(duì)路徑拼接系統(tǒng)文件路徑,否則可能導(dǎo)致后續(xù)應(yīng)用版本因應(yīng)用文件路徑變化導(dǎo)致不兼容問(wèn)題。應(yīng)該是用context去動(dòng)態(tài)獲取。
而rawfile是一種資源文件類(lèi)型,通常在應(yīng)用開(kāi)發(fā)過(guò)程中作為原始文件被打包進(jìn)應(yīng)用的資源目錄。它在 APK(安卓應(yīng)用安裝包)或者鴻蒙應(yīng)用安裝包(HAP)中是只讀的。
三、解決方案思路
1.首先我們需要通過(guò)getRawFileContentSync讀取rawfile下目標(biāo)文件的內(nèi)容val
let val: Uint8Array = context.resourceManager.getRawFileContentSync("test.zip");
2.之后創(chuàng)建本地沙箱的文件對(duì)象fileTarget
let pathDir: string = context.filesDir; // /data/storage/el2/base/haps/entry/filesconsole.info(this.TAG, "pathDir: " + pathDir);// 待拷貝文件沙箱路徑let filePath: string = pathDir + '/test.zip';console.info(this.TAG, "filePath: " + filePath);// 若文件不存在,則創(chuàng)建文件。let fileTarget = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
3.將val目標(biāo)文件內(nèi)容寫(xiě)入文件對(duì)象即可
let writeLen = fs.writeSync(fileTarget.fd, val.buffer as ArrayBuffer);
最后記得關(guān)閉fs
fs.closeSync(fileTarget);
完整源碼
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';
struct SandboxPage {private TAG: string = "SandboxPage";onCopyRawFileToLocal = ()=>{let context = getContext(this) as common.UIAbilityContext; // 獲取設(shè)備A的UIAbilityContext信息try {let val: Uint8Array = context.resourceManager.getRawFileContentSync("test.zip");console.info(this.TAG, "getRawFileContentSync done");let pathDir: string = context.filesDir; // /data/storage/el2/base/haps/entry/filesconsole.info(this.TAG, "pathDir: " + pathDir);// 待拷貝文件沙箱路徑let filePath: string = pathDir + '/test.zip';console.info(this.TAG, "filePath: " + filePath);// 若文件不存在,則創(chuàng)建文件。let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);console.info(this.TAG, "file done");let writeLen = fs.writeSync(file.fd, val.buffer as ArrayBuffer);console.info(this.TAG, "write data to file succeed and size is:" + writeLen);fs.closeSync(file);} catch (error) {let code = (error as BusinessError).code;let message = (error as BusinessError).message;console.error(this.TAG,`getRawFileContentSync failed, error code: ${code}, message: ${message}.`);}}build() {RelativeContainer() {Text("點(diǎn)擊拷貝zip到本地沙箱下").id('SandboxPageHelloWorld').fontSize(50).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }}).onClick(this.onCopyRawFileToLocal)}.height('100%').width('100%')}
}
驗(yàn)證zip拷貝成功:
1. IDE右下角找到 Device File Browser
2.根據(jù)你的app包名,找到zip的位置