OpenHarmony开发者论坛
标题:
OpenHarmony应用基于分布式文件系统及分布式数据对象实现跨设备文件的拷贝
[打印本页]
作者:
深开鸿_王肖云
时间:
2024-1-2 15:06
标题:
OpenHarmony应用基于分布式文件系统及分布式数据对象实现跨设备文件的拷贝
[md]# OpenHarmony应用基于分布式文件系统及分布式数据对象实现跨设备文件的拷贝
### 简介:
利用分布式组网成功后,分布式文件系统的共享特征,以及分布式数据对象的实时同步性,将要拷贝的文件首先通过fs.copy接口拷贝至分布式文件系统路径下,同时更新分布式数据对象将此次的拷贝文件信息进行更新。组网内其他设备或本设备,可通过分布式数据对象知道拷贝对象及位置信息,再次利用fs.copy接口将分布式文件系统下的文件拷贝至本设备。
![copy.png](
https://forums-obs.openharmony.c ... 9gdx9rsr3bppbb9.png
"copy.png")
分布式数据对象中的字段定义及作用如下:
from: '', ----该分布式对象的发送设备ID,用于设备判断该对象是本设备还是跨设备。
localFileUriList: [],--往分布式文件系统拷贝时的当前文件uri路径,如果是文件,前面会增加“file+”前缀。本设备拷贝时用这个字段作为copy的入参。
disFileUriList: [],--uri化的分布式文件路径,如果是文件,前面会增加“file+”前缀。跨设备拷贝时用此字段作为copy的入参。
disFileList: [], --没有uri化的分布式文件路径,该字段用于拷贝完后分布式文件系统下的文件清理。
### 文档环境:
- 开发环境:Windows 10专业版
- DevEco Studio版本:DevEco Studio 4.0Release (4.0.0.600)
- SDK版本:4.1.3.3 (full sdk)
- API版本:Version 11
- 开发板型号:DAYU200(RK3568)
- 系统版本:OpenHarmony 4.1.3.5
### 演示demo:
- 新建一个 Stage 框架的 demo 工程,在page/Index.ets中通过 let context = getContext(this) as common.UIAbilityContext;filePath = context.filesDir; 拿到应用的沙箱files路径信息,通过文件操作接口在files下创建文件夹test1,test2,并在文件夹test1下创建了文件file1.txt,file2.txt,file3.txt。
- 通过封装好的DataObject进行分布式数据对象的更新、清除等操作。
- 通过接口fs.copy进行本应用沙箱内与分布式文件系统之间的文件(夹)拷贝。
- demo运行效果:
![progress.png](
https://forums-obs.openharmony.c ... ukoljjlylokopw7.png
"progress.png")
核心代码如下:
```js
pasteFromDistributedDir(deviceId: string, directoryPath:string, fileData: Array<FileStructure>) {
let localDstUri = fileuri.getUriFromPath(directoryPath);
if (this.distributedObject["disFileUriList"].length === 0) {
return prompt.showToast({ message: \$r('app.string.label\_nodata') });
}
//本地拷贝:文件需进行重命名操作
if (deviceId == this.distributedObject["from"]) {
let localFileArray: Array<string> = this.distributedObject["localFileUriList"];
let newFileName:string = '';
localFileArray.forEach( item => {
//判断uri前缀是否有“file+”,如果是文件类型,去掉“file+”前缀,在localDstUri后面加上文件名称
if (item.includes("file+")) {
item = item.substring(5, item.length);
let fileName: string | undefined = item.split('/').pop();
if(fileName)
{
newFileName = fileName;
} else {
return;
}
//判断本地是否有同名文件,有则重命名
fileData.forEach(file => {
//有同名文件
if(file.name.includes(newFileName)){
//extension 文件后缀
let extension :string = newFileName.slice((newFileName.lastIndexOf(".") - 1 >>> 0) + 2);
if(extension){
let fileParts = newFileName.split('.');
newFileName = fileParts[0] + fileCopy + '.' + fileParts[1];
} else {
newFileName = newFileName + fileCopy;
}
}
})
}
FsManager.pasteFromDistributedDir(item,localDstUri+newFileName);
})
} else { //跨设备拷贝
let disFileUriArray: Array<string> = this.distributedObject["disFileUriList"];
disFileUriArray.forEach( item => {
if (item.includes("file+")) {
item = item.substring(5, item.length);
let fileName: string | undefined = item.split('/').pop();
let newFileName: string = '';
if(fileName)
{
newFileName = fileName;
} else {
return;
}
FsManager.pasteFromDistributedDir(item,localDstUri+newFileName);
} else {
FsManager.pasteFromDistributedDir(item,localDstUri);
}
})
}
}
copyFilesToDistributedDir(deviceId: string, needMoveFiles: Array<FileType>, disPathInSandbox: string) {
let distributedUri0 = fileuri.getUriFromPath(disPathInSandbox);
let localFileUriList: Array<string> = [];
let disFileUriList: Array<string> = [];
let disFileList: Array<string> = [];
let distributedUri = '';
needMoveFiles.forEach((file: FileType) => {
//用于粘贴完后的clear动作中
let disFilePath = disPathInSandbox + "/" + file.fileName;
//type: 1 directory,type 2 file
let localSrcUri = fileuri.getUriFromPath(file.filePath);
//如果是文件夹
if (file.type === 1) {
distributedUri = distributedUri0+ "/" + file.fileName;
FsManager.copyFilesToDistributedDir(localSrcUri,distributedUri);
}
//处理Uri,如果是文件类型,需另外处理,前缀增加"file+",用分布式对象进行传输
else if (file.type === 2) {
const fileName = localSrcUri.split('/').pop();
distributedUri = distributedUri0 +"/"+fileName;
FsManager.copyFilesToDistributedDir(localSrcUri,distributedUri);
localSrcUri = "file+" + localSrcUri;
distributedUri = "file+" + distributedUri;
} else {
Logger.error(TAG, \`this is not file or directory\`);
}
// to update DataObject
localFileUriList.push(localSrcUri);
disFileUriList.push(distributedUri);
disFileList.push(disFilePath);
})
this.update(deviceId,localFileUriList,disFileUriList,disFileList);
}
}
```
```
```
### sample仓地址:
本功能的sample仓地址:
https://gitee.com/openharmony/applications
\_app\_samples/tree/master/code/SuperFeature/DistributedAppDev/DistributedFilemanager
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5