鸿蒙OS开发实例:【应用级别文件浏览器】

 介绍

HarmonyOS的沙盒机制完全屏蔽了应用对手机公共存储空间的访问,安全性提高已不言而喻。 本篇文章的主要目的是为了能通过一个简单工具,可视化的让一个新手能相对轻松的学习文件&数据存储。HarmonyOS 应用开发工具DevEco Studio也没有提供读取存储器的功能,所以做一个简单版本的应用级别浏览器还是有必要的。

准备

  1. 请参照[官方指导],创建一个Demo工程,选择Stage模型
  2. 须熟读HarmonyOS 指导“[文件管理]gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md”

V2.0白皮书.png

效果

页面由三部分组成:1.标题栏(用于返回)2. 当前路径描述 3. 文件列表

Screenshot_20231204204057250.png

应用文件目录结构图

如果之前你熟悉Android存储目录,在学习HarmonyOS时,可以忘记之前所有了的东西了,因为HarmonyOS真的能让研发人员感受沙盒的存在,这点可以对标iOS系统

0000000000011111111.20231121184039.03067481202577079515515889587732.png

代码片段解析

1)获取个人应用沙盒下的所有根目录

this.context.bundleCodeDir
this.context.cacheDir
this.context.filesDir
this.context.preferencesDir
this.context.tempDir
this.context.databaseDir
this.context.distributedFilesDir

2)遍历目录

import fs from '@ohos.file.fs';//遍历 this.currentRoot 路径下的所有文件和文件夹
fs.listFile(this.currentRoot)

3)文件/文件夹类型判断

try {stat = fs.statSync(tempPath)
} catch (e) {//路径可能不存在return
}//判断是否为文件夹
stat.isDirectory()//判断是否为文件
stat.isFile()

核心文件

import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import { CommonConstants } from '../common/CommonConstants';
import FileManagerStructModel from '../viewmodel/FileManagerStruct';
import { Title } from '../view/Title';
import router from '@ohos.router';/*** 官方指导* https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/application-context-stage-0000001427744560-V3#ZH-CN_TOPIC_0000001574128741__%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E8%B7%AF%E5%BE%84**/
@Entry
@Component
struct FileManagerIndex {private context = getContext(this) as common.UIAbilityContext;//当前路径下的文件和文件夹@State listData: FileManagerStructModel[] = []@State filePaths: string[] = []@State childFilePaths: string[] = []@State currentRoot: string = ''pathLevel: number = 0@State pathTips: string = ''scroller: Scroller = new Scroller();initItem(item){let model = new FileManagerStructModel()model.currentDirName = item.substring(item.lastIndexOf('/')+1)model.currentPath = item.substring(0, item.lastIndexOf('/'))let stattry {stat = fs.statSync(item)} catch (e){console.log(e)return}if(fs.statSync(item).isDirectory()){model.isDir = truemodel.smallIMG = $r('app.media.ic_files_folder')} else {model.isDir = falseif(item.toLowerCase().endsWith('.png')|| item.toLowerCase().endsWith('.png')|| item.toLowerCase().endsWith('.jpg')|| item.toLowerCase().endsWith('.bmp')){model.smallIMG = $r('app.media.ic_files_image')} else  if(item.toLowerCase().endsWith('.doc')) {model.smallIMG = $r('app.media.ic_files_doc')} else  if(item.toLowerCase().endsWith('.log')) {model.smallIMG = $r('app.media.ic_files_log')} else  if(item.toLowerCase().endsWith('.html')) {model.smallIMG = $r('app.media.ic_files_html')} else  if(item.toLowerCase().endsWith('.pdf')) {model.smallIMG = $r('app.media.ic_files_pdf')} else  if(item.toLowerCase().endsWith('.xml')) {model.smallIMG = $r('app.media.ic_files_xml')} else  if(item.toLowerCase().endsWith('.txt')) {model.smallIMG = $r('app.media.ic_files_grid_txt')} else  if(item.toLowerCase().endsWith('.chm')) {model.smallIMG = $r('app.media.ic_files_chm')} else  if(item.toLowerCase().endsWith('.pptx')) {model.smallIMG = $r('app.media.ic_files_pptx')} else  if(item.toLowerCase().endsWith('.mp3')) {model.smallIMG = $r('app.media.ic_files_mp3')} else  if(item.toLowerCase().endsWith('.mp4')) {model.smallIMG = $r('app.media.ic_files_m4a')} else {model.smallIMG = $r('app.media.ic_files_unknown')}}this.listData.push(model)}initCurrentDir(){this.pathTips = '我的应用'this.listData = []this.filePaths.forEach((item)=>{this.initItem(item)})}aboutToAppear(){this.filePaths.push(this.context.bundleCodeDir)this.filePaths.push(this.context.cacheDir)this.filePaths.push(this.context.filesDir)this.filePaths.push(this.context.preferencesDir)this.filePaths.push(this.context.tempDir)this.filePaths.push(this.context.databaseDir)this.filePaths.push(this.context.distributedFilesDir)console.log(this.context.bundleCodeDir)console.log(this.context.cacheDir)console.log(this.context.filesDir)console.log(this.context.preferencesDir)console.log(this.context.tempDir)console.log(this.context.databaseDir)console.log(this.context.distributedFilesDir)this.initCurrentDir()}build(){Column(){Title({title: '返回'}).onClick(()=> {if (this.currentRoot != this.context.bundleCodeDir&& this.currentRoot != this.context.cacheDir&& this.currentRoot != this.context.filesDir&& this.currentRoot != this.context.preferencesDir&& this.currentRoot != this.context.tempDir&& this.currentRoot != this.context.databaseDir&& this.currentRoot != this.context.distributedFilesDir) {this.currentRoot = this.currentRoot.substring(0, this.currentRoot.lastIndexOf('/'))this.pathTips = this.pathTips.substring(0, this.pathTips.lastIndexOf('>'))this.pathLevel--fs.listFile(this.currentRoot).then((filesPath: string[]) => {this.listData = []filesPath.forEach((info) => {this.initItem(this.currentRoot + '/' + info)})})} else {this.pathLevel--console.log('当前级数:' + this.pathLevel)if(this.pathLevel < 0){router.back()return} else {this.initCurrentDir()}}}).height('5%')Text(this.pathTips).fontSize(10).fontColor(Color.Gray).width('100%').margin({top: 10, bottom: 10})Stack(){if(this.listData == null || this.listData.length == 0){Text('空空如也').width('100%').height('100%').fontSize(25).textAlign(TextAlign.Center)} else {List(){ForEach(this.listData, (item: FileManagerStructModel, index: number) => {ListItem(){Row(){Image(item.smallIMG).width(30).height(30).objectFit(ImageFit.Contain)Text(item.currentDirName).margin({left: 10})}.width('100%').height(60).onClick(()=>{let tempPath = item.currentPath + '/' + item.currentDirNameconsole.log(tempPath)let stattry {stat = fs.statSync(tempPath)} catch (e) {console.log(e)return}if(stat.isDirectory()){this.currentRoot = tempPaththis.pathTips = this.pathTips + '>' + item.currentDirName;this.pathLevel++this.listData = []fs.listFile(this.currentRoot).then( (filePaths: string[]) => {filePaths.forEach((info)=>{this.initItem(this.currentRoot+'/'+info)})})}})}})}.width('100%').height('100%')}}.width('100%').height('94%')}.alignItems(HorizontalAlign.Start).margin({top: 10}).padding({top: px2vp(AppStorage.Get(CommonConstants.StatusBarHeight)), left: '10vp', right: '10vp'})}}

 最后呢,很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

高清完整版请点击→《鸿蒙NEXT星河版开发学习文档》

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细资料鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的道路上更进一步。

《鸿蒙 (OpenHarmony)开发学习视频》

图片

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

OpenHarmony北向、南向开发环境搭建

图片

《鸿蒙开发基础》

  1. ArkTS语言

  2. 安装DevEco Studio

  3. 运用你的第一个ArkTS应用

  4. ArkUI声明式UI开发

  5. .……

图片

《鸿蒙开发进阶》

  1. Stage模型入门

  2. 网络管理

  3. 数据管理

  4. 电话服务

  5. 分布式应用开发

  6. 通知与窗口管理

  7. 多媒体技术

  8. 安全技能

  9. 任务管理

  10. WebGL

  11. 国际化开发

  12. 应用测试

  13. DFX面向未来设计

  14. 鸿蒙系统移植和裁剪定制

  15. ……

图片

《鸿蒙开发实战》

  1. ArkTS实践

  2. UIAbility应用

  3. 网络案例

  4. ……

图片

 获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2906137.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

.NET CORE 分布式事务(二) DTM实现TCC

目录 引言&#xff1a; 1. TCC事务模式 2. TCC组成 3. TCC执行流程 3.1 TCC正常执行流程 3.2 TCC失败回滚 4. Confirm/Cancel操作异常 5. TCC 设计原则 5.1 TCC如何做到更好的一致性 5.2 为什么只适合短事务 6. 嵌套的TCC 7. .NET CORE结合DTM实现TCC分布式事务 …

【Linux多线程】线程的同步与互斥

【Linux多线程】线程的同步与互斥 目录 【Linux多线程】线程的同步与互斥分离线程Linux线程互斥进程线程间的互斥相关背景概念问题产生的原因&#xff1a; 互斥量mutex互斥量的接口互斥量实现原理探究对锁进行封装(C11lockguard锁) 可重入VS线程安全概念常见的线程不安全的情况…

查询优化-提升子查询-UNION类型

瀚高数据库 目录 文档用途 详细信息 文档用途 剖析UNION类型子查询提升的条件和过程 详细信息 注&#xff1a;图片较大&#xff0c;可在浏览器新标签页打开。 SQL: SELECT * FROM score sc, LATERAL(SELECT * FROM student WHERE sno 1 UNION ALL SELECT * FROM student…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

Redis桌面客户端

3.4.Redis桌面客户端 安装完成Redis&#xff0c;我们就可以操作Redis&#xff0c;实现数据的CRUD了。这需要用到Redis客户端&#xff0c;包括&#xff1a; 命令行客户端图形化桌面客户端编程客户端 3.4.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1…

MySQL Innodb 引擎中预防 Update 操作上升为表锁

一、MySQL 如何预防 Update 上升为表锁 在 MySQL 中&#xff0c;进行任何数据的 修改 操作都会进行一定的锁操作&#xff0c;而锁的不同直接导致性能的差异。例如 MyISAM 引擎&#xff0c;更新时采用表锁&#xff0c;并发性较差。而 Innodb 引擎支持事务&#xff0c;更新时采用…

关于RPC

初识RPC RPC VS REST HTTP Dubbo Dubbo 特性&#xff1a; 基于接口动态代理的远程方法调用 Dubbo对开发者屏蔽了底层的调用细节&#xff0c;在实际代码中调用远程服务就像调用一个本地接口类一样方便。这个功能和Fegin很类似&#xff0c;但是Dubbo用起来比Fegin还要简单很多&a…

C++超市商品管理系统

一、简要介绍 1.本项目为面向对象程序设计的大作业&#xff0c;基于Qt creator进行开发&#xff0c;Qt框架版本6.4.1&#xff0c;编译环境MINGW 11.2.0。 2.项目结构简介&#xff1a;关于系统逻辑部分的代码的头文件在head文件夹中&#xff0c;源文件在s文件夹中。与图形界面…

新电脑如何给C盘扩容?怎么分盘?搞定

如何给C盘扩容&#xff1f;怎么分盘&#xff1f;搞定 马上到了升学考试季了&#xff0c;好多小伙伴们结束完毕后都开始为自己后续的学习生涯制备装备了&#xff0c;新手机&#xff0c;新电脑等等。但是有一个问题就是大多数人都只考虑电脑的配置&#xff0c;而忽略了实际使用的…

Ubuntu20.04上,VTK9.3在QT5上的环境配置与开发测试

Ubuntu20.04上&#xff0c;VTK9.3在QT5上的环境配置与开发测试 1 背景介绍2 VTK9.3的编译安装2.1 安装ccmake 和 VTK 的依赖项&#xff1a;2.2 建立VTK编译文件夹并下载2.3 cmake配置VTK9.3的编译环境2.4 make编译安装VTK9.32.5 测试VTK安装是否成功 3 基于qmake的QT5的VTK9.3开…

鸿蒙实战开发-使用常用组件与布局实现登录、首页、我的三个页面

介绍 HarmonyOS ArkUI提供了丰富多样的UI组件&#xff0c;您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。在本篇Codelab中&#xff0c;您将通过一个简单的购物社交应用示例&#xff0c;学习如何使用常用的基础组件和容器组件。 本示例主要包含&#xff1a;“登录”、…

系统开发实训小组作业week5 —— 用例描述与分析

目录 4.3 UC003电影浏览与查询 4.3.1 用例描述 4.3.2 活动图 4.3.3 界面元素 4.3.4 功能 4.4 UC004在线订票 4.4.1 用例描述 4.4.2 活动图 4.4.3 界面元素 4.4.4 功能 4.3 UC003电影浏览与查询 4.3.1 用例描述 用例号 UC003-01 用例名称 电影浏览与查询 用例描述…

【Hexo + Github 搭建自己的专属博客】

目录 一、前提环境配置 1. 安装Git和NodeJS 2. 安装Hexo 3. 加载主题 4. 修改主题配置 二、搭建博客 1. 将博客部署在GitHub上 2. 写文章并上传 3. 配置一些特效 三、最终成果 ​编辑 一、前提环境配置 1. 安装Git和NodeJS 在 Windows 上使用 Git &#xff0c;可以…

独立站如何采集商品?外贸独立站采集教程

最近和一位仿牌的卖家聊天&#xff0c;他想建个站做日本市场。除了产品素材、suk以外其它都能搞定&#xff0c;找到我帮忙。从这里Robert了解到还有国内有很多仿牌卖家、微商&#xff0c;都有类似的情况&#xff0c;他们出海的阻碍主要在于支付、物流、推广。只要解决了这些问题…

网站业务对接DDoS高防

准备需要接入的网站域名清单&#xff0c;包含网站的源站服务器IP&#xff08;仅支持公网IP的防护&#xff09;、端口信息等。所接入的网站域名必须已完成ICP备案。如果您的网站支持HTTPS协议访问&#xff0c;您需要准备相应的证书和私钥信息&#xff0c;一般包含格式为.crt的公…

Docker部署MongoDB+整合Mongo版MyBatis—Plus

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、 MongoDB简介1.1 适用场景1.2 应…

【跟着CHATGPT学习硬件外设 | 05】I2C

本文根据博主设计的Prompt由CHATGPT生成&#xff0c;形成极简外设概念。 &#x1f680; 1. 概念揭秘 I2C&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也被称为IIC或双线接口&#xff0c;是一种用于微控制器&#xff08;Microcontrollers&#xff09;和外设…

Rust控制台输出跑马灯效果,实现刷新不换行,实现loading效果

要在 Rust 中实现控制台刷新而不换行&#xff0c;以实现类似 "loading" 状态的效果&#xff0c;你可以使用 \r&#xff08;回车符&#xff09;来覆盖上一行的内容。 use std::io::{self, Write}; use std::thread; use std::time::Duration;fn main() {let loading_…

零拷贝技术探讨

零拷贝技术是一种用于提高数据传输效率的网络技术&#xff0c;主要应用于网络服务器中。它通过减少数据在操作系统内核空间和用户空间之间的复制次数来提高性能。 在传统的网络服务器中&#xff0c;当客户端向服务器发送请求时&#xff0c;服务器会从磁盘读取数据&#xff0c;…

tab切换组件,可横向自适应滑动

示例图&#xff1a; 注&#xff1a;需要引入Jquery <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.tabs-box {width: 100%;height: auto;}.tab-header-box {display: flex;overflow: hidden…