在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

自制一款鴻蒙應用文件管理器

OpenHarmony技術社區 ? 來源:OST開源開發者 ? 2023-03-08 14:22 ? 次閱讀

在涉及應用內部存儲的開發時,常常翻閱手機自帶的文件管理檢查。正好在學習文件管理的接口,想著實現一個第三方組件用于當前應用的文件查看和管理。

介紹

如下:

類型:第三方組件.ets

語言框架:ArkTs

API 版本:HarmonyOS SDK 8

模型:FA

目前已實現的功能:

上下級文件的瀏覽

查看文件基本信息(名稱、大小、修改日期)

刪除文件

文件路徑顯示

組件寬高、橫豎屏自適應

使用示例

代碼如下:

//導入組件
import{Filer}from'../views/filemanager';
//調用組件
structIndex{
...
Column(){
Filer()
//Filer({Width:'100%',Height:'100%'})//可傳入寬高參數
}.width('100%').height('100%')
}

接下來是實現思路的簡單分析,有興趣的可以看一下源代碼。

實現思路

主要涉及兩個方面:

接口函數

交互設計(后續出)

①接口函數

接口方法整理:接口函數涉及到文件目錄的訪問、文件信息的讀取、文件的刪除等,文檔接口非常多,但只需認識基本的幾個接口就夠用了。

文檔傳送門:@ohos.fileio (文件管理)-文件管理-接口參考(ArkTS及JS API)-手機、平板、智慧屏和智能穿戴開發-ArkTS API參考-HarmonyOS應用開發

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-fileio-0000001333640945#ZH-CN_TOPIC_0000001333640945__%E5%AF%BC%E5%85%A5%E6%A8%A1%E5%9D%97
importfileiofrom'@ohos.fileio';
importfeatureAbilityfrom'@ohos.ability.featureAbility';
letcontext=featureAbility.getContext();//FA模型獲取Context模塊
//letcontext=globalThis.abilityContext;//Stage模型獲取Context模塊
這里給大家整理了基本的接口:

116cdbba-b9cf-11ed-bfe3-dac502259ad0.png

11858b6a-b9cf-11ed-bfe3-dac502259ad0.png

下面是底層開放訪問的三大目錄:

11a56d04-b9cf-11ed-bfe3-dac502259ad0.png

以上接口返回的路徑都是以/data/user/0/包名/ 開頭,是多種訪問路徑的其中一種。

PS:Stage模型中提供的目錄訪問接口與 FA 不同,有三個目錄:tempDir、cacheDir、filesDir,還有其它類型的目錄如數據庫目錄等。

具體參考 gitee 文檔 Context 模塊:

https://gitee.com/openharmony/docs/blob/8504866055592da2a92a539ab0074c93642d6aa1/zh-cn/application-dev/reference/apis/js-apis-inner-application-context.md
API 9 還提供了新的文件管理接口,但是接口方法大同小異:
importfsfrom'@ohos.file.fs';

②代碼思路

以數據結構中最基本的樹狀結構數組來保存文件的父子關系和個體信息,每一次的文件操作相當于維護這樣的一個文件樹。

每一個文件對應一個 node 結點:

typenode={
id:number,//當前編號
fileName:string,//文件名稱
fileType:FileType,//文件類型
path:string,//完整有效訪問路徑
parentId:number,//父級編號
size:number,//文件大小
mTime:number//修改時間
}
enumFileType{
'dir'=0,//文件夾
'file'=1,//普通文件
'else'=2//其它類型文件
}
主要變量:
//---文件樹相關變量
privaterelativePath:string=''//內部存儲器上此應用程序的文件目錄
privateabsolutePath:string=''//根目錄
privatecachePath:string=''//內部存儲目錄
privatehistoryNodesTree:Array=[]//保存所有文件信息,即文件樹,需要維護
privaterootNodes:Array=[]//保存三大目錄根的信息,不可繼續往上訪問

//---與UI相關的變量
@StateprivatecurNodes:Array=[]//展示當前層級所有文件
@StateprivatepathArray:Array=['']//路徑分割數組,用于組件頂部路徑展示
@State@Watch('onCurParentNodeChange')curParentNode:node=undefined//保存上一級結點,方便結點和路徑更新
privateWidth:Length='100%'//組件默認寬
privateHeight:Length='100%'//組件默認高
維護文件樹方法:
backToDir()//返回上一級
deleteSelectedDir()//刪除操作
unlink()//刪除文件
rmdir()//刪除目錄
openSelectedDir()//打開目錄,進入下一級
addNewNode()//添加新結點
getOrCreateLocalDir()//獲取應用根目錄
getFilesDir()//獲取file://根目錄
getCacheDir()//獲取cache://根目錄
工具方法:
handleFileSize()//文件字節格式轉換
fileSizeTransform()//文件字節格式轉換
timestampToDate()//時間戳與常用時間格式轉換
下面是部分與 fileio 密切相關的函數: 打開選中目錄:

openSelectedDir(parentNode:node):void{//傳參:待打開的目錄結點
this.curParentNode=parentNode//更新保存當前結點的父結點
fileIo.opendir(parentNode.path).then(dir=>{//打開文件夾
letdirect=dir.readSync()//讀取下一個子文件
this.curNodes.length=0//刷新UI
while(direct!==undefined){//找出所有子文件,逐個構造node結點
this.addNewNode(parentNode,direct)
direct=dir.readSync()
}
dir.closeSync()//關閉目錄
}).catch(()=>{})
}

添加新文件結點:

addNewNode(parentNode:node,direct?:fileIo.Dirent):void{//構造node結點并維護文件樹
if(!direct){//入參重載
this.curNodes.push(parentNode)
this.historyNodesTree.push(parentNode)
return
}
letpath=parentNode.path+'/'+direct.name
letfileType=direct.isDirectory()//是否為文件夾類型
letsize:number=-1
letfileStat=fileIo.statSync(path)//獲取文件具體信息
if(!fileType&&fileStat.isFile()){//普通文件外的文件類型不展示字節大小
size=fileStat.size
}
letnewNode:node={//構造node結點
path:path,
fileName:direct.name,
fileType:fileType?0:direct.isFile()?1:2,
parentId:parentNode.id,
id:(this.historyNodesTree.length+1),
size:size,
mTime:fileStat.mtime
}
this.curNodes.push(newNode)//更新當前UI
this.historyNodesTree.push(newNode)//維護文件樹
console.info('fsj---addNewNode:'+newNode.fileName)
}

刪除目錄(包含刪除文件操作):

asyncrmdir(node:node){
letpath=node.path
awaitthis.bfsRmdir(path)//刪除所有子文件、子目錄后
fileIo.rmdir(node.path).then(()=>{//再刪除該目錄
showToast('刪除成功')
this.curNodes=this.curNodes.filter(item=>item.id!=node.id)
}).catch((err)=>{
showToast('刪除失敗:'+JSON.stringify(err))
})
}
asyncbfsRmdir(path:string):Promise{//深度搜索遍歷,刪除該目錄下的所有子文件、子目錄
returnnewPromise((res)=>{
fileIo.opendir(path).then(async(dir)=>{
letdirect=dir.readSync()
while(direct!==undefined){
letsonPath=path+'/'+direct.name
if(fileIo.statSync(sonPath).isDirectory()){
awaitthis.bfsRmdir(sonPath)
}
fileIo.unlinkSync(sonPath)
direct=dir.readSync()
}
dir.closeSync()
res()
})
})
}

PS:當目錄存在子文件時,不允許直接調用 rmdir() 刪除該目錄,需要先刪除所有子文件、子目錄,否則會報錯 code:39,這里我采用深度搜索遍歷的方法刪除所有子文件、子目錄。

錯誤碼參考鏈接(這是 3.1 beta 的文檔,終于可以清晰地知道錯誤碼的信息了。)

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/errorcode-filemanagement-0000001427585212-V3?catalogVersion=V3

效果圖

上下瀏覽:

11c91470-b9cf-11ed-bfe3-dac502259ad0.gif

刪除操作:

11fa47d4-b9cf-11ed-bfe3-dac502259ad0.gif

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8691

    瀏覽量

    151919
  • API
    API
    +關注

    關注

    2

    文章

    1511

    瀏覽量

    62396
  • 文件管理器
    +關注

    關注

    0

    文章

    17

    瀏覽量

    3171
  • 鴻蒙
    +關注

    關注

    57

    文章

    2392

    瀏覽量

    43052
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30577

原文標題:自制一款鴻蒙應用文件管理器

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    為Linux高級用戶提供的強大的文件管理器

    想要為系統提供高度可定制的文件管理器?nnn 就是個功能強大但輕量級的文件管理器,可在 Linux 終端內工作。
    發表于 11-14 11:19 ?1935次閱讀

    如何自制一款功能固定的紅外遙控

    如題現有自帶紅外遙控的家庭影院音響套,想應用在酒店場景中,即插卡上電以后,音響自動打開并播放。由于音響本身上電以后保持待機狀態,必須要通過遙控開關或者主機開關按鈕才能是開機狀態。因此想自制
    發表于 01-10 15:51

    關于自制一款簡易遙控開關

    自制一款簡易遙控,只控制開關即可,敢問哪位大神有詳細的電路原理圖
    發表于 02-15 16:30

    請問如何自制一款無刷電機控制?

    如何自制一款無刷電機控制
    發表于 03-16 10:25

    如何自制一款光耦檢測電路

    如何自制一款光耦檢測電路
    發表于 05-25 07:57

    sdk5鴻蒙利用文件管理器獲取文件Uri的過程

    )); } 捕捉(異常e){系統。出.println(e.toString()); }}} }}文件最大可以選擇500個,它返回的uri好像是安卓的uri,所以需要轉換成鴻蒙的,這樣子就到了看路徑的形式,他應該是把文件弄到了
    發表于 04-27 11:03

    USB燒錄和應用文件

    USB燒錄和應用文件
    發表于 03-02 18:01 ?196次下載

    re管理器漢化版(apk文件下載)

    re管理器漢化版(apk文件下載)Root Explorer(RE管理器)需要ROOT權限,新建文件夾,查看/編輯文件,軟件安裝,RootE
    發表于 07-01 11:57 ?0次下載
    re<b class='flag-5'>管理器</b>漢化版(apk<b class='flag-5'>文件</b>下載)

    re管理器刪除系統軟件操作方法

    RE管理器一款高權限文件管理器,獲取Root權限后對系統文件進行操作,可以新建文件夾,查看編輯
    發表于 12-20 11:44 ?1.3w次閱讀
    re<b class='flag-5'>管理器</b>刪除系統軟件操作方法

    re管理器進入編輯文件方法

    Root Explorer,R.E管理器用戶量巨大,裝機必備!安卓最佳文件管理器,沒有之!RE管理器原生簡體中文,支持新建
    發表于 12-20 13:47 ?4766次閱讀
    re<b class='flag-5'>管理器</b>進入編輯<b class='flag-5'>文件</b>方法

    什么是re文件管理器_re管理器有什么用

    Android用戶很多人遇到想找到手機系統文件卻找不到的情況,RE管理器就是一款手機Root后能夠獲得高級權限,查看手機系統文件,藍牙文件
    發表于 12-20 14:29 ?1.8w次閱讀

    數據庫的項目管理器是什么?項目管理器詳細資料總結

    項目管理器是VFP集成開發環境中的個重要組成部分。項目是文件、數據、文檔和對象的集合,項目管理器通過項目文件(.PJX和.PJT)對項目進
    發表于 09-18 17:43 ?5次下載
    數據庫的項目<b class='flag-5'>管理器</b>是什么?項目<b class='flag-5'>管理器</b>詳細資料總結

    如何在文件管理器中隱藏文件文件

    如果個系統被多個用戶使用,你或許出于個人原因想在文件管理器中隱藏文件文件夾不讓其他人看到
    發表于 05-13 09:34 ?1417次閱讀
    如何在<b class='flag-5'>文件</b><b class='flag-5'>管理器</b>中隱藏<b class='flag-5'>文件</b>和<b class='flag-5'>文件</b>夾

    壓縮文件管理器WinRAR安裝程序下載

    壓縮文件管理器WinRAR安裝程序下載
    發表于 08-31 10:45 ?15次下載

    文件管理器文件傳輸的操作方法

    AnyDesk安力桌為在本地和遠程端點之間文件傳輸,提供各種選項。這可以通過 "文件管理器"會話或通過遠程控制會話中的 "文件傳輸 "完成。
    的頭像 發表于 08-30 11:04 ?1603次閱讀
    主站蜘蛛池模板: 日韩一级一欧美一级国产 | 宅男色视频 | 色综合美国色农夫网 | 亚洲一区二区三区在线视频 | 天天射天天摸 | 插吧插吧综合网 | 日韩欧美不卡片 | 日本人69xxxxx | 婷婷婷色| 艹久久 | 男女交性永久免费视频播放 | 91夜夜人人揉人人捏人人添 | 中文字幕在线观看一区二区 | 婷婷五月情 | 国产高清一级视频在线观看 | 亚洲第一色视频 | 日韩一区二区三区在线 | 黄视频免费在线看 | 国产三级在线观看 | 大蕉久久伊人中文字幕 | 亚洲高清在线视频 | 国产永久视频夜色资源网 | 天天插天天干天天操 | 亚洲第八页| 华人永久免费视频 | 给我一个可以看片的www日本 | 就去色综合 | 天天在线天天看成人免费视频 | 久久综合九色综合98一99久久99久 | 免费免费啪视频视频观看 | 在线免费日韩 | 亚洲成人在线网站 | 午夜手机视频 | 午夜高清在线观看免费6 | 男人边吃奶边爱边做视频日韩 | 操他射他影院 | 婷婷婷色| 波多野结衣在线观看一区二区三区 | 久久黄色影片 | 国产精品久久国产三级国不卡顿 | 欧美黄色片免费观看 |