OpenHarmony—文件管理系列之二
前言
本系列記錄團隊openHarmony 的學習和實踐中,所踩過的坑以及填坑的記錄,可能社區已有分享相關的文檔,但也不妨大家一起探討。
一、獲取指定路徑下的文件列表
若需獲取指定路徑下的文件列表,可以通過直接調用 file.list 來獲取,也可以通過先調用 context.getFilesDir 來獲取到應用在內部存儲上的文件路徑,得到路徑后通過調用 fileio.opendir 可以獲取到存儲路徑下的文件。
**需注意:**file模塊從 API Version 6開始不再維護,官方建議使用fileio模塊。
1、file模塊調用
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模塊調用
getFilesDirUri() {
context.getFilesDir()
.then((data) => {
console.info('getFilesDir res' + data); // data 內部存儲目錄
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(); // 讀取下一個目錄項
if(dirent) {
console.log(dirent.name)
this.inquireFiles(dir); // 循環獲取下一個目錄下
}else {
dir.closeSync(); // 關閉目錄,釋放dir中的文件描述
}
},
二、文件管理api調用時發現的問題
1、注意設備的基線版本
遠程模擬器的底層內核是基于 HarmonyOS實現的,因此在遠程模擬器上可以調用實現的文件管理異步api。而底層內核基于OpenHarmony實現的設備,若無法成功調用文件管理異步api,那么就需要查看設備的基線版本號,查詢此基線版本是否支持文件管理的異步調用方式。
2、fileio模塊無復制文件夾方法
fileio模塊提供了文件的復制,但是沒有文件夾的復制,因此在實現文件夾復制時,可能需要自行去遍歷文件夾中的內容,逐個去遍歷其中的文件并復制到相應位置,新建同名文件夾到相應位置。
3、文件夾刪除時里面不能存在內容
fileio.rmdir刪除文件夾時,文件夾中不能存在文件、文件夾數據,只有當文件夾為空時才可以刪除文件夾。所以在刪除文件夾時需先刪除文件夾中的所有內容,再刪除文件夾 。
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))
});
文件夾中沒有文件數據執行刪除文件夾返回:
文件夾中存在文件數據執行刪除文件夾返回:
4、文件夾和文件移動
fileio模塊中沒有特定說明文件夾和文件的移動該如何實現,但我們可以通過 fileio.rename 重命名文件來實現,因為重命名文件需傳入兩個地址,一個是目標文件的當前絕對路徑,一個是目標文件的新絕對路徑,可以通過改變新絕對路徑來實現文件夾和文件的移動。
// 若文件夾存放路徑為:
let storagePath = 'res/data/data/com.kaihong.bookrack/files/storage/test';
// 需要移動到的路徑為:
let movePath = 'res/data/data/com.kaihong.bookrack/files/move';
// 將文件存放路徑后段拼接移動到的路徑
let Newpath = movePath + '/test'
fileio.rename(storagePath, Newpath)
.then(function(res) {
// 重命名文件成功,do something
}).catch(function(err){
});
三、總結
本次分享的內容是基于在文件管理模塊中發現的部分問題記錄,希望和大家一起成長。