OpenHarmony—文件管理系列之二
??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
前言
本系列記錄團(tuán)隊(duì)openHarmony 的學(xué)習(xí)和實(shí)踐中,所踩過的坑以及填坑的記錄,可能社區(qū)已有分享相關(guān)的文檔,但也不妨大家一起探討。
一、獲取指定路徑下的文件列表
若需獲取指定路徑下的文件列表,可以通過直接調(diào)用 file.list 來獲取,也可以通過先調(diào)用 context.getFilesDir 來獲取到應(yīng)用在內(nèi)部存儲(chǔ)上的文件路徑,得到路徑后通過調(diào)用 fileio.opendir 可以獲取到存儲(chǔ)路徑下的文件。
**需注意:**file模塊從 API Version 6開始不再維護(hù),官方建議使用fileio模塊。
1、file模塊調(diào)用
getlist() {
file.list({
uri: 'internal://app/',
success: function(data) {
if(data.fileList.length) {
data.fileList.forEach(item=>{
console.log(JSON.stringify(item))
})
}
},
fail: function (data, code) {
console.error('call fail callback fail, code: ' + code + ', data: ' + data);
},
complete: function (data, code) {
console.info('call complete callback complete, code: ' + code + ', data: ' + data);
},
});
},
2、fileio模塊調(diào)用
getFilesDirUri() {
context.getFilesDir()
.then((data) => {
console.info('getFilesDir res' + data); // data 內(nèi)部存儲(chǔ)目錄
this.opendir(data)
}).catch((error) => {
console.error('getFilesDir err' + error.message);
})
},
async opendir(path) {
let dir = await fileio.opendir(path); // dir 管理目錄
this.inquireFiles(dir);
},
async inquireFiles(dir) {
let dirent = await dir.read(); // 讀取下一個(gè)目錄項(xiàng)
if(dirent) {
console.log(dirent.name)
this.inquireFiles(dir); // 循環(huán)獲取下一個(gè)目錄下
}else {
dir.closeSync(); // 關(guān)閉目錄,釋放dir中的文件描述
}
},
二、文件管理api調(diào)用時(shí)發(fā)現(xiàn)的問題
1、注意設(shè)備的基線版本
遠(yuǎn)程模擬器的底層內(nèi)核是基于 HarmonyOS實(shí)現(xiàn)的,因此在遠(yuǎn)程模擬器上可以調(diào)用實(shí)現(xiàn)的文件管理異步api。而底層內(nèi)核基于OpenHarmony實(shí)現(xiàn)的設(shè)備,若無法成功調(diào)用文件管理異步api,那么就需要查看設(shè)備的基線版本號(hào),查詢此基線版本是否支持文件管理的異步調(diào)用方式。
2、fileio模塊無復(fù)制文件夾方法
fileio模塊提供了文件的復(fù)制,但是沒有文件夾的復(fù)制,因此在實(shí)現(xiàn)文件夾復(fù)制時(shí),可能需要自行去遍歷文件夾中的內(nèi)容,逐個(gè)去遍歷其中的文件并復(fù)制到相應(yīng)位置,新建同名文件夾到相應(yīng)位置。
3、文件夾刪除時(shí)里面不能存在內(nèi)容
fileio.rmdir刪除文件夾時(shí),文件夾中不能存在文件、文件夾數(shù)據(jù),只有當(dāng)文件夾為空時(shí)才可以刪除文件夾。所以在刪除文件夾時(shí)需先刪除文件夾中的所有內(nèi)容,再刪除文件夾 。
fileio.rmdir(path)
.then(function(res) {
// 刪除目錄成功,do something
console.log('rmdir res: '+JSON.stringify(res))
}).catch(function(err){
console.log('rmdir err: '+JSON.stringify(err))
});
文件夾中沒有文件數(shù)據(jù)執(zhí)行刪除文件夾返回:
文件夾中存在文件數(shù)據(jù)執(zhí)行刪除文件夾返回:
4、文件夾和文件移動(dòng)
fileio模塊中沒有特定說明文件夾和文件的移動(dòng)該如何實(shí)現(xiàn),但我們可以通過 fileio.rename 重命名文件來實(shí)現(xiàn),因?yàn)橹孛募鑲魅雰蓚€(gè)地址,一個(gè)是目標(biāo)文件的當(dāng)前絕對(duì)路徑,一個(gè)是目標(biāo)文件的新絕對(duì)路徑,可以通過改變新絕對(duì)路徑來實(shí)現(xiàn)文件夾和文件的移動(dòng)。
// 若文件夾存放路徑為:
let storagePath = 'res/data/data/com.kaihong.bookrack/files/storage/test';
// 需要移動(dòng)到的路徑為:
let movePath = 'res/data/data/com.kaihong.bookrack/files/move';
// 將文件存放路徑后段拼接移動(dòng)到的路徑
let Newpath = movePath + '/test'
fileio.rename(storagePath, Newpath)
.then(function(res) {
// 重命名文件成功,do something
}).catch(function(err){
});
三、總結(jié)
本次分享的內(nèi)容是基于在文件管理模塊中發(fā)現(xiàn)的部分問題記錄,希望和大家一起成長(zhǎng)。
??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??