HarmonyOS 5.0.0 或以上:跨设备远程文件发送(本机选择 → 对端保存)

HarmonyOS 5.0.0 或以上:实现跨设备远程文件发送(本机选择 → 对端保存)


📌 场景介绍

分布式文件协同适用于:

  • 在手机选择文件,发送到平板保存或打开

  • IoT 场景中将日志、配置从主设备推送到其他终端

  • 多端文件流转,实现“无感传送”

本篇实现:

  • 获取远程设备 ID

  • 使用分布式虚拟文件系统(DMS)访问远程路径

  • 将本地文件拷贝到对端 /storage/media 或指定路径

  • 异步回调结果


🧱 页面结构

/entry/src/main/ets
  ├── pages/
  │     └── RemoteFileTransferDemo.ets      // 跨端文件发送演示
  └── assets/
        └── demo.txt                         // 示例本地文件

🧩 RemoteFileTransferDemo.ets 示例页面

import fs from '@ohos.file.fs'
import dms from '@ohos.distributedFile.dfs'
import distributedHardware from '@ohos.distributedHardware.deviceManager'

@Entry
@Component
struct RemoteFileTransferDemo {
  @State status: string = '未开始'
  @State devices: Array<{ id: string, name: string }> = []

  private localFile: string = '/data/storage/el2/base/assets/demo.txt'
  private remoteFileName: string = 'received_demo.txt'

  aboutToAppear() {
    this.initDeviceDiscovery()
  }

  private async initDeviceDiscovery() {
    distributedHardware.createDeviceManager('com.example.harmony', (err, dm) => {
      if (err) return
      dm.on('deviceFound', (device) => {
        if (!this.devices.find(d => d.id === device.deviceId)) {
          this.devices.push({ id: device.deviceId, name: device.deviceName })
        }
      })
      dm.startDeviceDiscovery({
        subscribeId: 'remoteCopy',
        capability: 'dvkit',
        isWakeRemote: true,
        medium: 1
      })
    })
  }

  private async sendFileToDevice(deviceId: string) {
    try {
      // 读取本地文件内容
      const stat = await fs.stat(this.localFile)
      const f = await fs.open(this.localFile, fs.OpenMode.READ_ONLY)
      const buf = new Uint8Array(stat.size)
      await fs.read(f.fd, buf)
      await fs.close(f.fd)

      // 获取远端分布式路径
      const remotePath = `/mnt/hmdfs/${deviceId}/files/${this.remoteFileName}`
      const wf = await fs.open(remotePath, fs.OpenMode.CREATE | fs.OpenMode.WRITE_ONLY | fs.OpenMode.TRUNC)
      await fs.write(wf.fd, buf)
      await fs.close(wf.fd)

      this.status = `✅ 文件已发送到 ${deviceId}`
    } catch (err) {
      this.status = '❌ 发送失败:' + JSON.stringify(err)
      console.error('Send error:', err)
    }
  }

  build() {
    Column() {
      Text("📤 跨设备文件发送").fontSize(22).margin(20)
      Text(this.status).fontSize(14).fontColor('#888').marginBottom(10)

      ForEach(this.devices, (d) => {
        Button(`发送到 ${d.name}`).onClick(() => this.sendFileToDevice(d.id)).margin(6)
      })

      Text("📁 本地发送文件路径:").fontSize(12).marginTop(20)
      Text(this.localFile).fontSize(12).fontColor('#999')
    }
    .padding(20)
    .height('100%')
    .scrollable(true)
  }
}

✅ 效果说明

  • 自动发现分布式设备

  • 点击目标设备,即将本地 demo.txt 通过分布式路径 /mnt/hmdfs/设备ID/files/ 拷贝至对端

  • 对端文件系统将接收到 received_demo.txt

  • 无需使用 Socket/蓝牙,完全走鸿蒙分布式文件通道


🔧 拓展建议

  • 添加进度条、文件大小判断、成功提示动画

  • 支持文件列表选择与批量发送

  • 封装为 FileShareService,支持任意业务调用

  • 搭配跨端 Toast 或通知反馈接收状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值