鸿蒙开发-文件与分享

news2025/3/12 10:24:59

文件分类

按所有者:

  • 应用文件:所有者为应用,包括应用安装文件、应用资源文件、应用缓存文件等。

  • 用户文件:所有者是登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。

  • 系统文件:与应用和用户无关的其他文件,包括公共库、设备文件、系统资源文件等。

应用沙箱(虚拟目录,仅应用自己可见)

在这里插入图片描述

应用文件路径详细

在这里插入图片描述
在这里插入图片描述

写文件

//WriteFile.ets
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

let context = getContext(this) as common.UIAbilityContext
let filesDir = context.filesDir;

/**
 * 写文件
 * 把内容写入一个文件
 * @param content 内容字符串
 */
export function writeFile(content: string): void {
  let filePath = filesDir + '/test.txt' //文件路径
  // 用文件路径,创建一个文件流。w+: 覆盖式读写,无论该文件存在与否
  let fileStream = fileIo.createStreamSync(filePath, "w+");
  fileStream.writeSync(content);
  fileStream.close();
}

在这里插入图片描述

读文件

//ReadFile.ets
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { buffer } from '@kit.ArkTS';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
let res: string = '';

export function readFile(): string {
  //文件路径
  let filePath = filesDir + '/test.txt'
  //获取文件状态
  let stat = fileIo.statSync(filePath)
  let size = stat.size //文件大小
  //设置一个读取缓冲区,大小与文件大小一致
  let buf = new ArrayBuffer(size)
  // 根据文件路径打开文件流
  let fileStream = fileIo.createStreamSync(filePath, "r+")
  // 读取信息到缓冲区,同步方法(sync)
  fileStream.readSync(buf)
  // 文件读取到缓冲区后,再转换为通用buffer类型(二进制)
  let con = buffer.from(buf, 0)
  //buffer二进制数据,转换为字符串类型
  res = con.toString()
  //关闭文件流
  fileStream.close()

  return res;
}

文件分享

应用场景:应用A主动分享文件给应用B,应用B完成文件接收。

在这里插入图片描述

  • URI分享: 把文件在沙箱中的路径,转换成实际的物理路径(URI),即可分享。

文件分享: systemShare

//ShareFile.ets
import {  Want, wantConstant } from '@kit.AbilityKit';
import { common } from '@kit.AbilityKit';
import { fileUri } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { uniformTypeDescriptor } from '@kit.ArkData';
import { systemShare } from '@kit.ShareKit';

let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;


export
function shareFile2(){
  // 获取文件的沙箱路径
  let filePath = filesDir + '/test.txt'
  // 将沙箱路径转换为uri
  let uri1 = fileUri.getUriFromPath(filePath)

  let utd1 = ''
  if (canIUse('SystemCapability.DistributedDataManager.UDMF.Core')) {
    utd1 = uniformTypeDescriptor.UniformDataType.PLAIN_TEXT
  }
  let data = new systemShare.SharedData({
    utd: utd1,
    uri: uri1
  })

  let ctrl = new systemShare.ShareController(data)
  ctrl.show(context,{
    // 选用一种预览
    previewMode: systemShare.SharePreviewMode.DETAIL,
    // 选用一种选择模式, 例如单选
    selectionMode: systemShare.SelectionMode.SINGLE
  })
}

export default
function shareFile(){
  // 获取文件的沙箱路径
  let filePath = filesDir + '/test.txt'
  // 将沙箱路径转换为uri
  let uri = fileUri.getUriFromPath(filePath)
  let want: Want  = {
    // 配置被分享文件的读写权限,例如对被分享应用进行读写授权
    flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION |
    wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION,
    // 配置分享应用的隐式拉起规则
    action: 'ohos.want.action.sendData',
    uri: uri,
    type: 'text/plain'
  }
  context.startAbility(want)
    .then(() => {
      promptAction.showToast({
        message: '分享成功'
      })
    })
    .catch((err: BusinessError) => {
      promptAction.showToast({
        message: `分享失败:${err.code}, 原因:${err.message}`,
        duration: 5000
      })
    });
}

在这里插入图片描述

文件选择器 - Picker

  • PhotoViewPicker:图片/视频
  • DocumentViewPicker:各式文件
  • AudioViewPicker:音频
import { picker } from '@kit.CoreFileKit';
let photoPicker = new picker.PhotoViewPicker()
let docPicker = new picker.DocumentViewPicker()
let audioPicker = new picker.AudioViewPicker()
import fileIo from "@ohos:file.fs";
import picker from "@ohos:file.picker";
import type common from "@ohos:app.ability.common";
let context = getContext(this) as common.UIAbilityContext;
export async function photoPickerGetUri(): Promise<string> {
    //picker的选项配置
    let PhotoSelectOptions = new picker.PhotoSelectOptions();
    PhotoSelectOptions.maxSelectNumber = 1; //最大可选数
    let photoPicker = new picker.PhotoViewPicker();
    try {
        let result = await photoPicker.select(PhotoSelectOptions);
        console.info('选择结果 uri: ' + JSON.stringify(result));
        let photosUris = result.photoUris;
        return Promise.resolve(photosUris[0].toString());
    }
    catch (e) {
        console.error('出错: ' + JSON.stringify(e));
    }
    return Promise.reject();
}
export async function photoSave() {
    let options = new picker.PhotoSaveOptions;
    options.newFileNames = ['1.jpg']; //保存文件名
    let picker1 = new picker.PhotoViewPicker();
    try {
        let result = await picker1.save(options);
        let file = await fileIo.open(result[0], fileIo.OpenMode.READ_WRITE);
        let buffer = context.resourceManager.getMediaContentSync({ "id": 16777238, "type": 20000, params: [], "bundleName": "com.example.filesmanger", "moduleName": "entry" }.id);
        await fileIo.write(file.fd, buffer.buffer);
    }
    catch (e) {
        console.error('保存失败:' + JSON.stringify(e));
    }
}

Picker保存文件

import { picker, fileIo } from '@kit.CoreFileKit';
import { buffer } from '@kit.ArkTS';

export async function saveToUser(content: string) {
  try {
    let options = new picker.DocumentSaveOptions()
    options.newFileNames = ['test123.txt']
    let picker1 = new picker.DocumentViewPicker()
    let result = await picker1.save(options)

    //打开文件,读写模式
    let file = fileIo.openSync(result[0], fileIo.OpenMode.READ_WRITE)
    fileIo.writeSync(file.fd, content) //写入内容
    console.info('保存成功, uri: ' + JSON.stringify(result))
  } catch (error) {
    console.error('保存错误:' + JSON.stringify(error));
  }
}

export async function readUserFile(): Promise<string> {
  try {
    let options = new picker.DocumentSelectOptions()
    let documentPicker = new picker.DocumentViewPicker()
    let result = await documentPicker.select(options)
    let file = fileIo.openSync(result[0], fileIo.OpenMode.READ_WRITE)
    let buf = new ArrayBuffer(fileIo.statSync(file.fd).size)
    fileIo.readSync(file.fd, buf)
    let con = buffer.from(buf, 0)
    return Promise.resolve(con.toString())
  } catch (err) {
    console.error('读取失败: ' + JSON.stringify(err));
  }
  return Promise.reject()
}

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

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

相关文章

内存级文件原理——Linux

目录 进程与文件 Linux下的文件系统 文件操作&#xff0c;及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时&#xff0c;文件必…

KubeSphere 最佳实战:K8s 构建高可用、高性能 Redis 集群实战指南

首发&#xff1a;运维有术。 本指南将逐步引导您完成以下关键任务&#xff1a; 安装 Redis&#xff1a;使用 StatefulSet 部署 Redis。自动或手动配置 Redis 集群&#xff1a;使用命令行工具初始化 Redis 集群。Redis 性能测试&#xff1a;使用 Redis 自带的 Benchmark 工具进…

apr共享内存

下载&#xff1a; Download - The Apache Portable Runtime Project 编译&#xff1a; 使用cmake-gui生成库&#xff1a; apr-1.lib aprapp-1.lib libapr-1.lib libaprapp-1.lib libapr-1.dll 在Developer PowerShell for VS 2019中&#xff1a; 执行nmake -f Makefile.win来…

Javaweb前端HTML css 整体布局

最后一个是线条颜色 盒子&#xff0c;整体还是300&#xff0c;400

5.STM32之通信接口《精讲》之USART通信---实验串口接收程序

根据上节&#xff0c;我们一已经完成了串口发送程序的代码&#xff0c;并且深入的解析探索了串口的原理&#xff0c;接下来&#xff0c;Whappy小编将带领大家进入串口接收程序的探索与实验&#xff0c;并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

SpringMVC 执行流程详解

目录 前言1. SpringMVC 的核心组件概述1.1 DispatcherServlet1.2 HandlerMapping1.3 HandlerAdapter1.4 拦截器&#xff08;HandlerInterceptor&#xff09;1.5 ViewResolver 2. SpringMVC 的执行流程详解2.1 接收请求并分发2.2 获取 HandlerExecutionChain2.3 获取 HandlerAda…

安卓应用安装过程学习

声明&#xff1a;此文章来自http://shuwoom.com/?p60的学习记录 启动式安装 public static final IPackageManager main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {PackageManagerService m new PackageManagerService(context, inst…

如何通过OpenSSL来创建自签名的CA证书?

通过创建自签名CA证书可以让我们在没有商业支持的情况下学习与研究PKI&#xff08;公钥基础设施&#xff09;和SSL/TLS技术&#xff0c;本文将详细介绍如何通过OpenSSL来创建自签名的CA证书。 1. 初衷&#xff1a;为什么需要创建自签名CA证书&#xff1f; 除了开篇引言中提到的…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

Python中“暂停”(time.sleep?input?)

input函数最是经典&#xff0c;在多种实现中简单粗暴单纯而经济。 (笔记模板由python脚本于2024年11月22日 10:58:38创建&#xff0c;本篇笔记适合比较熟悉python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大…

刷题——【模板】二维前缀和

前缀和 题目题目链接题解方法一方法二 题目 描述 给你一个 n 行 m 列的矩阵 A &#xff0c;下标从1开始。 接下来有 q 次查询&#xff0c;每次查询输入 4 个参数 x1 , y1 , x2 , y2 请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和&#xff0c; 输入描述&#x…

10 - Clickhouse集群部署以及副本和分片

目 一、副本 1、简介 2、副本写入流程 3、副本配置步骤 3.1、启动zookeeper集群 3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下&#xff1a; 3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如…

Ubuntu24.04LTS设置root用户可远程登录

Ubuntu24.04LTS设置root用户可远程登录 文章目录 Ubuntu24.04LTS设置root用户可远程登录1. 设置root密码2. 设置root用户可远程登录1. 查看ssh服务是否安装2. 安装ssh服务3. 再次查看ssh服务是否安装4. 配置ssh文件5. 重启ssh服务6. root远程登录 1. 设置root密码 Ubuntu安装后…

DMA理论篇

DMA理论篇 简介 传统的数据传输都是需要CPU来实现&#xff0c;从一个地方拷贝到另一个地方&#xff1b;而DMA(Direct Memory Access)则不完全依赖CPU&#xff0c;DMA更新芯片SOC的一个控制器&#xff0c;他可以控制数据从内存中传输到另一个地方(外设、soc其它模块)&#xff…

理解原子变量之三:原子性与memory_order_relaxed

目录 CPU与内存的关系 原子性 典型使用场景 在本系列的第一篇文章理解原子变量之一&#xff1a;从互斥锁到原子变量&#xff0c;最粗浅的认识_原子互斥-CSDN博客&#xff0c;我通过几个实例从感性认识的角度介绍了原子性。本文在第一篇文章的基础上&#xff0c;从理性认识的…

医院信息化与智能化系统(22)

医院信息化与智能化系统(22) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

青少年编程等级考试C++一级,硬币反转问题

代码 #include<iostream>using namespace std;bool a[300];int main(){ int n,m; cin >> n >> m; for(int i 1;i < m;i) { for (int j 1;j < n;j) { if( j % i 0) { a[j] !a[j];…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…