1、关键字

fileAccess;U盘;获取所有文件信息

2、需求背景

在使用外接U盘设备传输文件时,需要读取到U盘中文件信息。

3、实现步骤

  • 通过fileAccess创建createFileAccessHelper;

    let fileAccessHelper = fileAccess.createFileAccessHelper(getContext());
    
  • 通过createFileAccessHelper获取根元素,对根目录下元素进行遍历;

    fileAccessHelper.getRoots()
        .then((roots) => {
          console.info(TAG, `getRoots success`);
          if(roots) {
            // 遍历根节点目录
            let isRootsDone = false;
            while(!isRootsDone){
              let rootsData = roots.next();
              isRootsDone = rootsData.done;
              let rootInfo = rootsData.value;
              console.info(TAG, `rootsData: 'deviceType': ${JSON.stringify(rootInfo.deviceType)}, 'name': ${JSON.stringify(rootInfo.displayName)}, 'done': ${JSON.stringify(rootsData.done)}`);
              // 选择deviceType = 6 (选择USB文件)
              if (rootInfo && rootInfo.deviceType == 6) {
                let isFileDone = false;
                let fileIterator = rootInfo.listFile();
                // 定义一个list接收root下所有文件(包含文件夹)
                let fileList: fileAccess.FileInfo[] = [];
                while (!isFileDone) {
                  let fileData = fileIterator.next();
                  isFileDone = fileData.done;
                  if (!isFileDone) {
                    fileList.push(fileData.value);
                  }
                }
                console.info(TAG, `file list length: ${fileList.length}`);
                // 迭代遍历
                this.LoopDir(fileList);
              }
            }
          }
        })
      .then((err) => {
          console.info(TAG, `getRoots fail, err: ${JSON.stringify(err)}`);
        })
    
  • 判断文件是文件 or 文件夹

    // 通过fileAccess.FileInfo中的mode属性进行文件类型判断
    isFile(mode: number) {
      return (mode & fileExtensionInfo.DocumentFlag.REPRESENTS_FILE) == fileExtensionInfo.DocumentFlag.REPRESENTS_FILE;
    }
    
  • 递归遍历根目录下所有文件/文件夹

    LoopDir(fileInfoList: fileAccess.FileInfo[]) {
      // 循环list中每个元素
      for (let i = 0; i < fileInfoList.length; i++) {
        console.info(TAG, `ergodicDir enter count: ${i}`);
        let fileInfo: fileAccess.FileInfo = fileInfoList[i];
        // 判断当前文件是文件 or 文件夹
        if (this.isFile(fileInfo.mode)) {
          // 如果是文件,进入业务逻辑处理;可通过createFileAccessHelper.openFile()获取文件的fd
          console.info(TAG, `ergodicDir fileInfo: ${JSON.stringify(fileInfo.uri)}; ${JSON.stringify(fileInfo.fileName)}`);
        } else {
          let iterator = fileInfo.listFile();
          let isDone = false;
          // 如果是文件夹,再进行节点迭代(类似于将当前文件当做新的root)
          let tempList: fileAccess.FileInfo[] = [];
          while (!isDone) {
            let fileData = iterator.next();
            isDone = fileData.done;
            if (!isDone) {
              tempList.push(fileData.value);
            }
          }
          // 继续使用递归方式进行文件下元素迭代
          this.LoopDir(tempList);
        }
      }
    }
    

相关文档

相关API使用请参考https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-fileAccess.md

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐