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

举报
Serendipity·y 发表于 2022/02/17 00:26:13 2022/02/17
【摘要】 一、简介 ① 基本概念 分布式文件服务能够为用户设备中的应用程序提供多设备之间的文件共享能力,支持相同帐号下同一应用文件的跨设备访问,应用程序可以不感知文件所在的存储设备,能够在多个设备之间无缝获取文...

一、简介

① 基本概念
  • 分布式文件服务能够为用户设备中的应用程序提供多设备之间的文件共享能力,支持相同帐号下同一应用文件的跨设备访问,应用程序可以不感知文件所在的存储设备,能够在多个设备之间无缝获取文件。
  • 分布式文件是指依赖于分布式文件系统,分散存储在多个用户设备上的文件,应用间的分布式文件目录互相隔离,不同应用的文件不能互相访问。
  • 文件元数据是用于描述文件特征的数据,包含文件名,文件大小,创建、访问、修改时间等信息。
② 运作机制
  • 分布式文件服务采用无中心节点的设计,每个设备都存储一份全量的文件元数据和本设备上产生的分布式文件,元数据在多台设备间互相同步,当应用需要访问分布式文件时,分布式文件服务首先查询本设备上的文件元数据,获取文件所在的存储设备,然后对存储设备上的分布式文件服务发起文件访问请求,将文件内容读取到本地。
  • 分布式文件服务运作如下图所示:

在这里插入图片描述

③ 权限与限制
  • 应用程序如需使用分布式文件服务完整功能,需要申请 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();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 设备 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
  • 2
  • 3
  • 4
  • 5

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/118672909

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。