# 跨设备文件访问 åˆ†å¸ƒå¼æ–‡ä»¶ç³»ç»Ÿä¸ºåº”用æä¾›äº†è·¨è®¾å¤‡æ–‡ä»¶è®¿é—®çš„能力,开å‘者在两个设备安装åŒä¸€åº”用时,通过[基础文件接å£](app-file-access.md),å¯è·¨è®¾å¤‡è¯»å†™å¦ä¸€ä¸ªè®¾å¤‡è¯¥åº”用[åˆ†å¸ƒå¼æ–‡ä»¶è·¯å¾„](app-sandbox-directory.md#应用沙箱目录)(/data/storage/el2/distributedfiles/ï¼‰ä¸‹çš„æ–‡ä»¶ã€‚ä¾‹å¦‚ï¼šå¤šè®¾å¤‡æ•°æ®æµè½¬çš„场景,设备组网互è”之åŽï¼Œè®¾å¤‡A上的应用å¯è®¿é—®è®¾å¤‡BåŒåº”用分布å¼è·¯å¾„下的文件,当期望应用文件被其他设备访问时,åªéœ€å°†æ–‡ä»¶ç§»åŠ¨åˆ°åˆ†å¸ƒå¼æ–‡ä»¶è·¯å¾„å³å¯ã€‚ ## 开呿¥éª¤ 1. 完æˆåˆ†å¸ƒå¼ç»„网。 将需è¦è·¨è®¾å¤‡è®¿é—®çš„两个设备登录åŒä¸€è´¦å·ï¼Œä¿è¯è®¾å¤‡è“牙和Wi-Fi功能开å¯ï¼Œè“ç‰™æ— éœ€äº’è¿žï¼ŒWi-Fiæ— éœ€æŽ¥å…¥åŒä¸€ä¸ªå±€åŸŸç½‘。 2. 访问跨设备文件。 åŒä¸€åº”用ä¸åŒè®¾å¤‡ä¹‹é—´å®žçŽ°è·¨è®¾å¤‡æ–‡ä»¶è®¿é—®ï¼Œåªéœ€è¦å°†å¯¹åº”çš„æ–‡ä»¶æ”¾åœ¨åº”ç”¨æ²™ç®±çš„åˆ†å¸ƒå¼æ–‡ä»¶è·¯å¾„å³å¯ã€‚ 设备A上在分布å¼è·¯å¾„下创建测试文件,并写入内容。示例ä¸çš„contextçš„èŽ·å–æ–¹å¼è¯·å‚è§[获å–UIAbility的上下文信æ¯](../application-models/uiability-usage.md#获å–uiability的上下文信æ¯)。 ```ts import { fileIo as fs } from '@kit.CoreFileKit'; import { common } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; let context = getContext(this) as common.UIAbilityContext; // 获å–设备Açš„UIAbilityContextä¿¡æ¯ let pathDir: string = context.distributedFilesDir; // 获å–分布å¼ç›®å½•的文件路径 let filePath: string = pathDir + '/test.txt'; try { // 在分布å¼ç›®å½•下创建文件 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); console.info('Succeeded in createing.'); // 呿–‡ä»¶ä¸å†™å…¥å†…容 fs.writeSync(file.fd, 'content'); // 关闿–‡ä»¶ fs.closeSync(file.fd); } catch (error) { let err: BusinessError = error as BusinessError; console.error(`Failed to openSync / writeSync / closeSync. Code: ${err.code}, message: ${err.message}`); } ``` 设备B主动å‘设备Aå‘起建链,建链æˆåŠŸåŽè®¾å¤‡Bå¯åœ¨åˆ†å¸ƒå¼è·¯å¾„ä¸‹è¯»å–æµ‹è¯•文件。 > **说明:** > > 这里通过分布å¼è®¾å¤‡ç®¡ç†çš„æŽ¥å£èŽ·å–设备networkId,详è§[è®¾å¤‡ç®¡ç†æŽ¥å£](../reference/apis-distributedservice-kit/js-apis-distributedDeviceManager.md)。 ```ts import { fileIo as fs } from '@kit.CoreFileKit'; import { common } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { buffer } from '@kit.ArkTS'; import { distributedDeviceManager } from '@kit.DistributedServiceKit' // 通过分布å¼è®¾å¤‡ç®¡ç†çš„æŽ¥å£èŽ·å–设备Açš„networkIdä¿¡æ¯ let dmInstance = distributedDeviceManager.createDeviceManager("com.example.hap"); let deviceInfoList: Array<distributedDeviceManager.DeviceBasicInfo> = dmInstance.getAvailableDeviceListSync(); let networkId = deviceInfoList[0].networkId; // 定义访问公共文件目录的回调 let listeners : fs.DfsListeners = { onStatus: (networkId: string, status: number): void => { console.info('Failed to access public directory'); } } // 访问并挂载公共文件目录 fs.connectDfs(networkId, listeners).then(() => { console.info("Success to connectDfs"); let context = getContext(); // 获å–设备Bçš„UIAbilityContextä¿¡æ¯ let pathDir: string = context.distributedFilesDir; // 获å–分布å¼ç›®å½•的文件路径 let filePath: string = pathDir + '/test.txt'; try { // 打开分布å¼ç›®å½•下的文件 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE); // å®šä¹‰æŽ¥æ”¶è¯»å–æ•°æ®çš„ç¼“å˜ let arrayBuffer = new ArrayBuffer(4096); // è¯»å–æ–‡ä»¶çš„内容,返回值是读å–到的å—节个数 class Option { public offset: number = 0; public length: number = 0; } let option = new Option(); option.length = arrayBuffer.byteLength; let num = fs.readSync(file.fd, arrayBuffer, option); // 打å°è¯»å–åˆ°çš„æ–‡ä»¶æ•°æ® let buf = buffer.from(arrayBuffer, 0, num); console.info('read result: ' + buf.toString()); } catch (error) { let err: BusinessError = error as BusinessError; console.error(`Failed to openSync / readSync. Code: ${err.code}, message: ${err.message}`); } }).catch((error: BusinessError) => { let err: BusinessError = error as BusinessError; console.error(`Failed to connectDfs Code: ${err.code}, message: ${err.message}`); }); ``` 3. B设备访问跨设备文件完æˆï¼Œæ–开链路。 ```ts import { BusinessError } from '@kit.BasicServicesKit'; import { distributedDeviceManager } from '@kit.DistributedServiceKit' import { fileIo as fs } from '@kit.CoreFileKit'; // 获å–设备Açš„networkId let dmInstance = distributedDeviceManager.createDeviceManager("com.example.hap"); let deviceInfoList: Array<distributedDeviceManager.DeviceBasicInfo> = dmInstance.getAvailableDeviceListSync(); let networkId = deviceInfoList[0].networkId; // å–æ¶ˆå…¬å…±æ–‡ä»¶ç›®å½•挂载 fs.disconnectDfs(networkId).then(() => { console.info("Success to disconnectDfs"); }).catch((error: BusinessError) => { let err: BusinessError = error as BusinessError; console.error(`Failed to disconnectDfs Code: ${err.code}, message: ${err.message}`) }) ```