自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自制一款ArkUI組件-應用文件管理器(一)

系統(tǒng) OpenHarmony
在涉及應用內(nèi)部存儲的開發(fā)時,常常翻閱手機自帶的文件管理檢查。正好在學習文件管理的接口,想著實現(xiàn)一個第三方組件用于當前應用的文件查看和管理。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

前言

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

介紹

  • 類型:第三方組件.ets
  • 語言框架:ArkTs
  • API版本:HarmonyOS SDK 8
  • 模型:FA

目前已實現(xiàn)的功能:

  • 上下級文件的瀏覽
  • 查看文件基本信息(名稱、大小、修改日期)
  • 刪除文件
  • 文件路徑顯示
  • 組件寬高、橫豎屏自適應

使用示例

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

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

實現(xiàn)思路

主要涉及兩個方面:

  1. 接口函數(shù)
  2. 交互設(shè)計(后續(xù)出)

1.接口函數(shù)

(1)接口方法整理

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

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

import fileio from '@ohos.fileio';
import featureAbility from '@ohos.ability.featureAbility';
let context = featureAbility.getContext();// FA模型獲取Context模塊
// let context = globalThis.abilityContext;// Stage模型獲取Context模塊

這里給大家整理了基本的接口:

相關(guān)對象

描述

fileio.Dir

目錄實例

fileio.Direct

目錄項實例

fileio.stat

文件具體信息

相關(guān)接口方法

作用

fileio.openDir(path: string)

打開目錄(文件夾)

fileio.stat(path: string)

獲取文件信息(大小、修改日期等)

fileio.unlink(path: string)

刪除文件

fileio.rmDir(path: string)

刪除目錄

fileio.Dir.read()

讀取下一個目錄項

fileio.Dir.close()

關(guān)閉目錄

fileio.Direct.name

目錄項名稱屬性

fileio.Direct.isDirectory()

是否為目錄(文件夾)

fileio.Direct.isFile()

是否為普通文件

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

相關(guān)接口方法

作用

訪問

Context.getOrCreateLocalDir()

獲取應用程序的本地根目錄

preferences目錄所在

Context.getCacheDir()

獲取該應用程序的內(nèi)部存儲目錄

cache 臨時目錄 internal://cache

Context.getFilesDir()

獲取內(nèi)部存儲器上此應用程序的文件目錄

files 文件(私有)目錄 internal://app

以上接口返回的路徑都是以 /data/user/0/包名/ 開頭,是多種訪問路徑的其中一種。
PS:
Stage模型中提供的目錄訪問接口與FA不同,有三個目錄:tempDir、cacheDir、filesDir,還有其它類型的目錄如數(shù)據(jù)庫目錄等,具體參考gitee文檔 ??Context模塊??。
API 9 還提供了新的文件管理接口,但是接口方法大同小異:

import fs from '@ohos.file.fs';
(2)代碼思路

以數(shù)據(jù)結(jié)構(gòu)中最基本的樹狀結(jié)構(gòu)數(shù)組來保存文件的父子關(guān)系和個體信息,每一次的文件操作相當于維護這樣的一個文件樹

每一個文件對應一個node結(jié)點:

type node = {
id: number, // 當前編號
fileName: string, // 文件名稱
fileType: FileType, // 文件類型
path: string, // 完整有效訪問路徑
parentId: number, // 父級編號
size: number, // 文件大小
mTime: number // 修改時間
}
enum FileType {
'dir' = 0,// 文件夾
'file' = 1,// 普通文件
'else' = 2// 其它類型文件
}

主要變量:

//--- 文件樹相關(guān)變量
private relativePath: string = '' //內(nèi)部存儲器上此應用程序的文件目錄
private absolutePath: string = '' //根目錄
private cachePath: string = '' //內(nèi)部存儲目錄
private historyNodesTree: Array<node> = [] // 保存所有文件信息,即文件樹,需要維護
private rootNodes: Array<node> = [] // 保存三大目錄根的信息,不可繼續(xù)往上訪問

//--- 與UI相關(guān)的變量
@State private curNodes: Array<node> = [] // 展示當前層級所有文件
@State private pathArray: Array<string> = [''] // 路徑分割數(shù)組,用于組件頂部路徑展示
@State @Watch('onCurParentNodeChange') curParentNode: node = undefined // 保存上一級結(jié)點,方便結(jié)點和路徑更新
private Width: Length = '100%' // 組件默認寬
private Height: Length = '100%' // 組件默認高

維護文件樹方法:

backToDir() // 返回上一級
deleteSelectedDir() // 刪除操作
unlink() // 刪除文件
rmdir() // 刪除目錄
openSelectedDir() // 打開目錄,進入下一級
addNewNode() // 添加新結(jié)點
getOrCreateLocalDir() // 獲取應用根目錄
getFilesDir() // 獲取file://根目錄
getCacheDir() // 獲取cache://根目錄

工具方法:

handleFileSize() // 文件字節(jié)格式轉(zhuǎn)換
fileSizeTransform() // 文件字節(jié)格式轉(zhuǎn)換
timestampToDate() // 時間戳與常用時間格式轉(zhuǎn)換

下面是部分與fileio密切相關(guān)的函數(shù):

  • 打開選中目錄
openSelectedDir(parentNode: node): void { // 傳參:待打開的目錄結(jié)點
this.curParentNode = parentNode // 更新保存當前結(jié)點的父結(jié)點
fileIo.opendir(parentNode.path).then(dir => { // 打開文件夾
let direct = dir.readSync() // 讀取下一個子文件
this.curNodes.length = 0 // 刷新UI
while (direct !== undefined) { // 找出所有子文件,逐個構(gòu)造node結(jié)點
this.addNewNode(parentNode, direct)
direct = dir.readSync()
}
dir.closeSync() // 關(guān)閉目錄
}).catch(() => {})
}
  • 添加新文件結(jié)點
addNewNode(parentNode: node, direct?: fileIo.Dirent): void { // 構(gòu)造node結(jié)點并維護文件樹
if (!direct) { // 入?yún)⒅剌d
this.curNodes.push(parentNode)
this.historyNodesTree.push(parentNode)
return
}
let path = parentNode.path + '/' + direct.name
let fileType = direct.isDirectory() // 是否為文件夾類型
let size: number = -1
let fileStat = fileIo.statSync(path) // 獲取文件具體信息
if (!fileType && fileStat.isFile()) { // 普通文件外的文件類型不展示字節(jié)大小
size = fileStat.size
}
let newNode: node = { // 構(gòu)造node結(jié)點
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)
}
  • 刪除目錄(包含刪除文件操作)
async rmdir(node: node) {
let path = node.path
await this.bfsRmdir(path) // 刪除所有子文件、子目錄后
fileIo.rmdir(node.path).then(() => { // 再刪除該目錄
showToast('刪除成功')
this.curNodes = this.curNodes.filter(item => item.id != node.id)
}).catch((err) => {
showToast('刪除失敗: ' + JSON.stringify(err))
})
}
async bfsRmdir(path: string): Promise<void> { // 深度搜索遍歷,刪除該目錄下的所有子文件、子目錄
return new Promise((res) => {
fileIo.opendir(path).then(async (dir) => {
let direct = dir.readSync()
while (direct !== undefined) {
let sonPath = path + '/' + direct.name
if (fileIo.statSync(sonPath).isDirectory()) {
await this.bfsRmdir(sonPath)
}
fileIo.unlinkSync(sonPath)
direct = dir.readSync()
}
dir.closeSync()
res()
})
})
}

PS: 當目錄存在子文件時,不允許直接調(diào)用 rmdir() 刪除該目錄,需要先刪除所有子文件、子目錄,否則會報錯code:39,這里我采用深度搜索遍歷的方法刪除所有子文件、子目錄。
??錯誤碼參考鏈接?? (這是 3.1 beta 的文檔,終于可以清晰地知道錯誤碼的信息了。)

效果圖

上下瀏覽:

【FFH】自制一款ArkUI組件-應用文件管理器(一)-開源基礎(chǔ)軟件社區(qū)


刪除操作:

【FFH】自制一款ArkUI組件-應用文件管理器(一)-開源基礎(chǔ)軟件社區(qū)

文章相關(guān)附件可以點擊下面的原文鏈接前往下載

 https://ost.51cto.com/resource/2542。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-02-27 16:40:19

ArkUI組件文件管理器

2013-11-12 09:59:48

2020-05-20 16:01:45

Windows 10軟件包管理器微軟

2022-08-03 08:56:22

massCode開源

2023-01-29 07:49:57

2012-06-04 10:02:19

Linux文件管理器

2011-09-16 17:00:19

iOS應用Camera Geni

2011-09-16 16:31:21

iPhone應用Groove資源管理

2020-12-03 09:33:58

前端開發(fā)工具

2010-12-14 14:36:57

Tripwire

2011-09-19 10:56:21

IOS應用Frenzapp Mu音樂

2011-09-16 15:05:26

IOS應用Trover定位發(fā)現(xiàn)

2011-09-19 13:58:55

iPhone應用軟件Mobli照片共享

2022-01-26 09:03:40

架構(gòu)

2011-01-04 16:16:59

2019-01-31 11:01:57

2024-06-28 08:49:24

2019-09-05 09:08:53

Android TV文件管理器應用軟件

2015-10-23 14:22:24

GNOME GamesGNOMELinux

2015-11-27 09:18:11

AngularJSWeb應用
點贊
收藏

51CTO技術(shù)棧公眾號