HarmonyOS之数据管理·分布式文件服务的应用

华为分布式文件服务提供跨设备文件共享能力,采用无中心节点设计,支持多设备间文件无缝访问。通过同步文件元数据实现设备间文件同步,应用需获取ohos.permission.DISTRIBUTED_DATASYNC权限并确保设备登录同一华为账号。在多设备并发写操作时,后写覆盖先写,应用需处理冲突。应用可利用POSIX接口访问分布式文件,实现多设备文件共享。
摘要由CSDN通过智能技术生成
一、简介
① 基本概念
  • 分布式文件服务能够为用户设备中的应用程序提供多设备之间的文件共享能力,支持相同帐号下同一应用文件的跨设备访问,应用程序可以不感知文件所在的存储设备,能够在多个设备之间无缝获取文件。
  • 分布式文件是指依赖于分布式文件系统,分散存储在多个用户设备上的文件,应用间的分布式文件目录互相隔离,不同应用的文件不能互相访问。
  • 文件元数据是用于描述文件特征的数据,包含文件名,文件大小,创建、访问、修改时间等信息。
② 运作机制
  • 分布式文件服务采用无中心节点的设计,每个设备都存储一份全量的文件元数据和本设备上产生的分布式文件,元数据在多台设备间互相同步,当应用需要访问分布式文件时,分布式文件服务首先查询本设备上的文件元数据,获取文件所在的存储设备,然后对存储设备上的分布式文件服务发起文件访问请求,将文件内容读取到本地。
  • 分布式文件服务运作如下图所示:

在这里插入图片描述

③ 权限与限制
  • 应用程序如需使用分布式文件服务完整功能,需要申请 ohos.permission.DISTRIBUTED_DATASYNC 权限。
  • 多个设备需要登录相同华为帐号,然后打开多个设备的蓝牙,或将多个设备接入同一 WLAN 局域网,才能实现文件的分布式共享。
  • 当多台设备对同一文件并发写操作时有数据冲突,后写会覆盖先写,应用需要主动保证时序控制并发流程。
  • 应用访问分布式文件时,如果文件所在设备离线,文件不能访问。
  • 网络情况差时,访问存储在远端的分布式文件时,可能会长时间不返回或返回失败,应用需要考虑这种场景的处理。
  • 当两台设备有同名文件时,同步元数据时会产生冲突,冲突的解决策略:
    • 本地跟远端冲突 ,远端文件被重命名,看到的同名文件是本地同名文件,远端文件被重命名;
    • 远端多个设备冲突,以接入本设备 ID 为顺序,显示设备 ID 小的同名文件,其他文件被依次重命名;
    • 如果组网场景,目录树下已经有远端文件,创建同名文件,提示文件已存在;
    • 冲突文件显示 _conflict_dev 后依次加 id;
    • 同名目录之间仅融合不存在冲突,文件和远端目录同名冲突,远端目录后缀加 _remote_directory。
④ 应用场景
  • 应用可以通过分布式文件服务实现多个设备间的文件共享,设备1上的应用 A 创建了分布式文件 a,设备2上的应用 A 能够通过分布式文件服务读写设备1上的文件 a。
二、分布式文件服务的 API
  • 分布式文件兼容 POSIX 文件操作接口,应用使用 Context.getDistributedDir() 接口获取目录后,可以直接使用 libc 或 JDK 访问分布式文件。
  • 分布式文件服务 API 接口功能:
接口名描述
Context.getDistributedDir()获取文件的分布式目录
三、使用流程
  • 应用可以通过 Context.getDistributedDir() 接口获取属于自己的分布式目录,然后通过 libc 或 JDK 接口,在该目录下创建、删除、读写文件或目录。
  • 设备1上的应用 A 创建文件 hello.txt,并写入内容"Hello World"。
	Context context;
	... // context初始化
	File distDir = context.getDistributedDir();
	String filePath = distDir + File.separator + "hello.txt";
	FileWriter fileWriter = new FileWriter(filePath, true);
	fileWriter.write("Hello World");
	fileWriter.close();
  • 设备 2 上的应用 A 通过 Context.getDistributedDir() 接口获取分布式目录。
  • 设备 2 上的应用 A 读取文件 hello.txt。
	FileReader fileReader = new FileReader(filePath);
	char[] buffer = new char[1024];        
	fileReader.read(buffer);        
	fileReader.close();        
	System.out.println(buffer);
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ栺尖篴夢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值