分布式文件服务概述
分布式文件服务能够为用户设备中的应用程序提供多设备之间的文件共享能力,支持相同帐号下同一应用文件的跨设备访问,应用程序可以不感知文件所在的存储设备,能够在多个设备之间无缝获取文件。
基本概念
- 分布式文件
分布式文件是指依赖于分布式文件系统,分散存储在多个用户设备上的文件,应用间的分布式文件目录互相隔离,不同应用的文件不能互相访问。
- 文件元数据
文件元数据是用于描述文件特征的数据,包含文件名,文件大小,创建、访问、修改时间等信息。
运作机制
分布式文件服务采用无中心节点的设计,每个设备按目录树管理。当应用需要访问分布式文件时,根据Cache订阅发布,按需缓存文件所在的存储设备,然后对缓存的分布式文件服务发起文件访问请求。
图1 分布式文件服务运作示意图
约束与限制
- 应用程序如需使用分布式文件服务完整功能,需要申请ohos.permission.DISTRIBUTED_DATASYNC权限。
- 多个设备需要登录相同华为帐号,然后打开多个设备的蓝牙,或将多个设备接入同一WLAN局域网,才能实现文件的分布式共享。
- 当多台设备对同一文件并发写操作时有数据冲突,后写会覆盖先写,应用需要主动保证时序控制并发流程。
- 应用访问分布式文件时,如果文件所在设备离线,文件不能访问。
- 网络情况差时,访问存储在远端的分布式文件时,可能会长时间不返回或返回失败,应用需要考虑这种场景的处理。
- 当两台设备有同名文件时,同步元数据时会产生冲突。冲突解决策略:1.本地跟远端冲突 ,远端文件被重命名,看到的同名文件是本地同名文件,远端文件被重命名;2.远端多个设备冲突,以接入本设备ID为顺序,显示设备ID小的同名文件,其他文件被依次重命名;3.如果组网场景,目录树下已经有远端文件,创建同名文件,提示文件已存在;4. 冲突文件显示_conflict_dev后依次加id;5. 同名目录之间仅融合不存在冲突,文件和远端目录同名冲突,远端目录后缀加_remote_directory
分布式文件服务开发
场景介绍
应用可以通过分布式文件服务实现多个设备间的文件共享,设备1上的应用A创建了分布式文件a,设备2上的应用A能够通过分布式文件服务读写设备1上的文件a。
接口说明
分布式文件兼容POSIX文件操作接口,应用使用Context.getDistributedDir()接口获取目录后,可以直接使用libc或JDK访问分布式文件。
接口名 | 描述 |
---|---|
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。
Context context;
... // context初始化
File distDir = context.getDistributedDir();
String filePath = distDir + File.separator + "hello.txt";
FileReader fileReader = new FileReader(filePath);
char[] buffer = new char[1024];
fileReader.read(buffer);
fileReader.close();
System.out.println(buffer);