当前位置: 首页 > news >正文

鸿蒙关于手机全局本地文件读取,写入

一.背景

需求是需要操作用户手机中的文件,不是应用沙箱

二.解决方案

这里要注意的一点拿到fsOpen.path的路径再去进行open文件,因为这里还不知道本地文件路径在哪里,需要选择一下路径再拿到路径去请求

1.这里就是进行两个fs.open,拿到你需要操作的文件的路径以后第一个就没用了,如果是需要新建文件也可以省去这步
const DocumentSelectOptions = new picker.DocumentSelectOptions();let context = getContext(this) as common.Context;// 创建文件选择器实例。const documentViewPicker = new picker.DocumentViewPicker(context);documentViewPicker.select(DocumentSelectOptions).then(async (documentSelectResult) => {// 获取选择路径let uri = documentSelectResult[0];console.log('e2qdw',uri)// 若文件不存在则创建文件//const fsOpen = await fs.open(uri,fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE)//console.log(fsOpen.path)const fsOpen = await fs.open(这里的路径就是fsOpen.path,fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE)// 读取文件this.readFile(fsOpen)// 写入this.writeFile(fsOpen)}).catch((err:BusinessError) => {console.error(`Invoke documentPicker.select failed, code is ${err.code}, message is ${err.message}`);})
2.第一步拿到以后就可以替换成这个代码 ,找到需要操作文件的路径,DocumentSelectOptions文件选择器就没用了
 async getFiles() {try {// 若文件不存在则创建文件// OpenMode.CREATE若文件不存在,则创建文件。//OpenMode.TRUNC如果文件存在且文件具有写权限,则将其长度裁剪为零。覆盖  不是追加const fsOpen = await fs.open('/storage/Users/currentUser/Download/jrdl.json',fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE|fs.OpenMode.TRUNC)// // 读取文件this.readFile(fsOpen)// this.deleteFile(fsOpen)// 写入this.writeFile(fsOpen)} catch (e) {console.error(`Invoke documentViewPicker.save failed, code is ${e.code}, message is ${e.message}`);}}
3.读写文件代码
readFile(fsOpen:fs.File){// 读取文件let arrayBuffer = new ArrayBuffer(4096);fs.read(fsOpen.fd, arrayBuffer, (err: BusinessError, readLen: number) => {if (err) {console.error("read failed with error message: " + err.message + ", error code: " + err.code);} else {console.info("read file data succeed");let buf = buffer.from(arrayBuffer, 0, readLen);console.info(`成功读取文件内容: ${buf.toString()}`);}// fs.closeSync(fsOpen);});}writeFile(fsOpen:fs.File){let str: string = "hello,word";fs.write(fsOpen.fd, str, (err: BusinessError, writeLen: number) => {if (err) {console.error("write data to file failed with error message:" + err.message + ", error code: " + err.code);} else {promptAction.showToast({ message: '成功写入',duration:2000,alignment:Alignment.Center })console.info("成功写入大小为:" + writeLen);}fs.closeSync(fsOpen);});}
4.完整代码

封装成工具类了这里已经,直接拿着就能用

import { BusinessError } from '@kit.BasicServicesKit';
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs'; // 导入文件管理模块
import { buffer } from '@kit.ArkTS';
import { promptAction } from '@kit.ArkUI';
import { picker } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';//执行UDP通讯的对象
export class fileUtils {async getFiles() {try {// 若文件不存在则创建文件const fsOpen = await fs.open('/storage/Users/currentUser/Download/jrdl.json',fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE|fs.OpenMode.TRUNC)// // 读取文件this.readFile(fsOpen)// this.deleteFile(fsOpen)// 写入this.writeFile(fsOpen)} catch (e) {console.error(`Invoke documentViewPicker.save failed, code is ${e.code}, message is ${e.message}`);}}readFile(fsOpen:fs.File){// 读取文件let arrayBuffer = new ArrayBuffer(4096);fs.read(fsOpen.fd, arrayBuffer, (err: BusinessError, readLen: number) => {if (err) {console.error("read failed with error message: " + err.message + ", error code: " + err.code);} else {console.info("read file data succeed");let buf = buffer.from(arrayBuffer, 0, readLen);console.info(`成功读取文件内容: ${buf.toString()}`);}// fs.closeSync(fsOpen);});}writeFile(fsOpen:fs.File){let str: string = "hello,word";fs.write(fsOpen.fd, str, (err: BusinessError, writeLen: number) => {if (err) {console.error("write data to file failed with error message:" + err.message + ", error code: " + err.code);} else {promptAction.showToast({ message: '成功写入',duration:2000,alignment:Alignment.Center })console.info("成功写入大小为:" + writeLen);}fs.closeSync(fsOpen);});}deleteFile(){fs.unlink('/storage/Users/currentUser/Download/jrdl.json').then(() => {console.info("remove file succeed");}).catch((err: BusinessError) => {console.error("remove file failed with error message: " + err.message + ", error code: " + err.code);});}
}

5.调用

  new fileUtils().getFiles()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • The Sandbox 新提案: 2024 年亚洲和拉丁美洲区块链活动预算
  • 一文读懂 服务器
  • Linux搭建环境:从零开始掌握基础操作(二)
  • 高性能 Web 服务器:让网页瞬间绽放的魔法引擎(下)
  • Vue3 的 expose 介绍
  • 代码随想录 day 48 单调栈
  • Chat App 项目之解析(三)
  • 数据结构——关于栈
  • swift微调款框架使用自定义数据集进行通义千问1.5的微调
  • 网站自动化锚文本的实现逻辑
  • Spring websocket并发发送消息异常的解决
  • 保研考研机试攻略:第三章——数学(3)
  • 基于Arch的轻量级发行版Archcraft结合内网穿透实现远程SSH连接
  • Python居然有这么多文件扩展
  • Docker手动在虚拟机上部署前端、后端和数据库
  • [译]Python中的类属性与实例属性的区别
  • AngularJS指令开发(1)——参数详解
  • DataBase in Android
  • ES6核心特性
  • github指令
  • Zepto.js源码学习之二
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何优雅地使用 Sublime Text
  • 使用putty远程连接linux
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • Java总结 - String - 这篇请使劲喷我
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # Kafka_深入探秘者(2):kafka 生产者
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (5)STL算法之复制
  • (AngularJS)Angular 控制器之间通信初探
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)JPA - JQPL 实现增删改查
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)jQuery 基础
  • (转)memcache、redis缓存
  • ****三次握手和四次挥手
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Family_物联网
  • .Net Core 笔试1
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [100天算法】-二叉树剪枝(day 48)
  • [20171113]修改表结构删除列相关问题4.txt
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [IE编程] IE8 新增的C++开发接口
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
  • [Linux安全运维] Nginx安装部署以及LNMP框架搭建保姆级教程
  • [Lua实战]整理Lua中忽略的问题
  • [MZ test.16]P1 评测