鸿蒙应用开发:读取U盘文件

外置存储设备(如SD卡、U盘等)具备可插拔属性,因此系统提供了设备插拔事件的监听及挂载功能,用于管理外置存储设备,当前仅对系统应用开放。

基于fileAccessHelper查找USB目录

鸿蒙 3.2中StorageManger已支持外部存储设备自动挂载,也就说当用户插入U盘后,鸿蒙内核会监听到外部设备,然后直接挂载到系统根目录:file://docs/storage/上。开发者仅需遍历一级目录查找deviceType为6的USB设备目录即可。

import common from '@ohos.app.ability.common';
import fileAccess from '@ohos.file.fileAccess';
import usb from '@ohos.usb';

let TAG = 'USB====='

let context = getContext(this) as common.UIAbilityContext
let fileAccessHelper = fileAccess.createFileAccessHelper(context);
let out = {
  uri: '',
  relativePath: '',
  fileName: '',
  mode: 0,
  size: 0,
  mtime: 0,
  mimeType: ''
}

export class UsbUtil {

  // 设备文件列表
  static fileList: fileAccess.FileInfo[] = []

  // 获取USB设备目录下文件属性信息
  static usbGetList(){
    // 获取根节点
    fileAccessHelper.getRoots()
      .then((roots)=>{
        console.info(TAG + 'getRoots success!')
        if(roots){
          // 遍历根目录
          let isRootsDone = false
          while (!isRootsDone){
            // 获取下一级设备根目录
            let rootsData = roots.next()
            isRootsDone = rootsData.done
            // 根属性信息
            let rootsInfo: fileAccess.RootInfo = rootsData.value
            // 是否为USB设备
            if(rootsInfo && rootsInfo.deviceType == 6){
              console.info(TAG + 'get usb devices!')
              let isFileDone = false
              // 获取第一级符合条件的文件(夹)信息
              let fileIterator = rootsInfo.listFile()
              if (!fileIterator) {
                console.error(TAG + "listFile interface returns an undefined object")
              }

              while (!isFileDone){
                // 获取USB设备目录下文件信息
                let fileData = fileIterator.next()
                isFileDone = fileData.done
                // 目标文件信息
                UsbUtil.fileList.push(fileData.value)
                console.info(TAG + 'get goal!')
              }
            }
          }
        }
      })
  }

 获取USB目录下文件名

  /**
   * 获取USB设备目录下文件名
   */
  public usbFilesName() {
    const list = new ArrayList();
    for (let i = 0; i < UsbUtil.fileList.length; i++) {
      const file = UsbUtil.fileList[i];
      if (!file) {
        continue
      }
      console.log("file uri: " + file.uri)

      list.add({
        uri: file.uri,
        relativePath: file.relativePath,
        fileName: file.fileName,
        mode: file.mode,
        size: file.size,
        mtime: file.mtime,
        mimeType: file.mimeType,
      })
    }
    console.info(TAG + list)
    let res = JSON.stringify(list)
    // console.info(TAG + res)
    return res
  }

注:interface好像不能被序列化~头秃

基于volumemanager查看USB设备使用信息

  /**
   * 获取USB总空间、可用空间
   */
  static usbSpace(){
    // 总空间
    volumemanager.getAllVolumes().then((volumes: Array<volumemanager.Volume>) => {
      // 卷设备的通用唯一识别码
      let uuid: string = volumes[0].uuid;
      // 获取外置存储设备中指定卷设备的总空间大小(单位为Byte)
      storageStatistics.getTotalSizeOfVolume(uuid).then((number: number) => {
        UsbUtil.USBTotalSpace = UsbUtil.bytesToGB(number)
        console.info(TAG + "getTotalSizeOfVolume successfully:" + number);
      }).catch((err: BusinessError) => {
        console.error(TAG + "getTotalSizeOfVolume failed with error:" + JSON.stringify(err));
      });
      // 可用空间大小
      storageStatistics.getFreeSizeOfVolume(uuid).then((number: number) => {
        UsbUtil.USBFreeSpace = UsbUtil.bytesToGB(number)
        console.info(TAG + "getFreeSizeOfVolume successfully:" + number);
      }).catch((err: BusinessError) => {
        console.error(TAG + "getFreeSizeOfVolume failed with error:" + JSON.stringify(err));
      });
    }).catch((err: BusinessError) => {
      console.error(TAG + "getAllVolumes failed with error:" + JSON.stringify(err));
    });

  }

  /**
   * 单位换算
   */
  static bytesToGB(bytes:number):string {
    return (bytes / 1024 ** 3).toFixed(2) // 转换为GB并保留两位小数
  }

OK!方法就这些,剩下的使用就是文件读写删等操作了。

欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值