1# 跨设备文件访问 2 3分布式文件系统为应用提供了跨设备文件访问的能力,开发者在两个设备安装同一应用时,通过[基础文件接口](app-file-access.md),可跨设备读写另一个设备该应用[分布式文件路径](app-sandbox-directory.md#应用沙箱目录)(/data/storage/el2/distributedfiles/)下的文件。例如:多设备数据流转的场景,设备组网互联之后,设备A上的应用可访问设备B同应用分布式路径下的文件,当期望应用文件被其他设备访问时,只需将文件移动到分布式文件路径即可。 4 5## 开发步骤 6 71. 完成分布式组网。 8 将需要跨设备访问的两个设备登录同一账号,保证设备蓝牙和Wi-Fi功能开启,蓝牙无需互连,Wi-Fi无需接入同一个局域网。 9 102. 访问跨设备文件。 11 同一应用不同设备之间实现跨设备文件访问,只需要将对应的文件放在应用沙箱的分布式文件路径即可。 12 13 设备A上在分布式路径下创建测试文件,并写入内容。示例中的context的获取方式请参见[获取UIAbility的上下文信息](../application-models/uiability-usage.md#获取uiability的上下文信息)。 14 15 ```ts 16 import { fileIo as fs } from '@kit.CoreFileKit'; 17 import { common } from '@kit.AbilityKit'; 18 import { BusinessError } from '@kit.BasicServicesKit'; 19 20 let context = getContext(this) as common.UIAbilityContext; // 获取设备A的UIAbilityContext信息 21 let pathDir: string = context.distributedFilesDir; 22 // 获取分布式目录的文件路径 23 let filePath: string = pathDir + '/test.txt'; 24 25 try { 26 // 在分布式目录下创建文件 27 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 28 console.info('Succeeded in createing.'); 29 // 向文件中写入内容 30 fs.writeSync(file.fd, 'content'); 31 // 关闭文件 32 fs.closeSync(file.fd); 33 } catch (error) { 34 let err: BusinessError = error as BusinessError; 35 console.error(`Failed to openSync / writeSync / closeSync. Code: ${err.code}, message: ${err.message}`); 36 } 37 ``` 38 39 设备B主动向设备A发起建链,建链成功后设备B可在分布式路径下读取测试文件。 40 > **说明:** 41 > 42 > 这里通过分布式设备管理的接口获取设备networkId,详见[设备管理接口](../reference/apis-distributedservice-kit/js-apis-distributedDeviceManager.md)。 43 44 ```ts 45 import { fileIo as fs } from '@kit.CoreFileKit'; 46 import { common } from '@kit.AbilityKit'; 47 import { BusinessError } from '@kit.BasicServicesKit'; 48 import { buffer } from '@kit.ArkTS'; 49 import { distributedDeviceManager } from '@kit.DistributedServiceKit' 50 51 // 通过分布式设备管理的接口获取设备A的networkId信息 52 let dmInstance = distributedDeviceManager.createDeviceManager("com.example.hap"); 53 let deviceInfoList: Array<distributedDeviceManager.DeviceBasicInfo> = dmInstance.getAvailableDeviceListSync(); 54 let networkId = deviceInfoList[0].networkId; 55 56 // 定义访问公共文件目录的回调 57 let listeners : fs.DfsListeners = { 58 onStatus: (networkId: string, status: number): void => { 59 console.info('Failed to access public directory'); 60 } 61 } 62 63 // 访问并挂载公共文件目录 64 fs.connectDfs(networkId, listeners).then(() => { 65 console.info("Success to connectDfs"); 66 let context = getContext(); // 获取设备B的UIAbilityContext信息 67 let pathDir: string = context.distributedFilesDir; 68 // 获取分布式目录的文件路径 69 let filePath: string = pathDir + '/test.txt'; 70 71 try { 72 // 打开分布式目录下的文件 73 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE); 74 // 定义接收读取数据的缓存 75 let arrayBuffer = new ArrayBuffer(4096); 76 // 读取文件的内容,返回值是读取到的字节个数 77 class Option { 78 public offset: number = 0; 79 public length: number = 0; 80 } 81 let option = new Option(); 82 option.length = arrayBuffer.byteLength; 83 let num = fs.readSync(file.fd, arrayBuffer, option); 84 // 打印读取到的文件数据 85 let buf = buffer.from(arrayBuffer, 0, num); 86 console.info('read result: ' + buf.toString()); 87 } catch (error) { 88 let err: BusinessError = error as BusinessError; 89 console.error(`Failed to openSync / readSync. Code: ${err.code}, message: ${err.message}`); 90 } 91 }).catch((error: BusinessError) => { 92 let err: BusinessError = error as BusinessError; 93 console.error(`Failed to connectDfs Code: ${err.code}, message: ${err.message}`); 94 }); 95 ``` 96 973. B设备访问跨设备文件完成,断开链路。 98 99 ```ts 100 import { BusinessError } from '@kit.BasicServicesKit'; 101 import { distributedDeviceManager } from '@kit.DistributedServiceKit' 102 import { fileIo as fs } from '@kit.CoreFileKit'; 103 104 // 获取设备A的networkId 105 let dmInstance = distributedDeviceManager.createDeviceManager("com.example.hap"); 106 let deviceInfoList: Array<distributedDeviceManager.DeviceBasicInfo> = dmInstance.getAvailableDeviceListSync(); 107 let networkId = deviceInfoList[0].networkId; 108 109 // 取消公共文件目录挂载 110 fs.disconnectDfs(networkId).then(() => { 111 console.info("Success to disconnectDfs"); 112 }).catch((error: BusinessError) => { 113 let err: BusinessError = error as BusinessError; 114 console.error(`Failed to disconnectDfs Code: ${err.code}, message: ${err.message}`) 115 }) 116 ```