HarmonyOS鸿蒙NEXT手机设备如何访问外置存储文件

HarmonyOS鸿蒙NEXT手机设备如何访问外置存储文件 需要创建日志文件到外部存储目录,方便用户可以打开,发送该文件给研发查问题,怎么实现?

3 回复

通过picker来访问用户相关文件,拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。

外置存储系统文件的访问,先用文件选择器把系统文件夹里的文件拷贝到沙箱,再对沙箱里的文件进行各种操作。 具体方法是:调用DocumentViewPicker可以实现预览系统文件,再把选中的文件写入到对应的沙箱中。示例代码如下:

import { common } from '@kit.AbilityKit';
import { picker } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import fs from '@ohos.file.fs';

@Entry
@Component
struct Index {

  build() {
    Row() {
      Column() {
        Button('查看U盘文件并导入到沙箱')
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            let context = getContext(this) as common.Context; // 请确保getContext(this)返回结果为UIAbilityContext
            let documentPicker = new picker.DocumentViewPicker(context);
            let documentSelectOptions = new picker.DocumentSelectOptions();
            // filePathList:选中的文件集合
            documentPicker.select(documentSelectOptions).then((filePathList: Array<string>) => {
              for (let i = 0; i < filePathList.length; i++) {
                let filePath = filePathList[i];
                let toPath = getContext().filesDir;
                let newFrom = filePath.substring(filePath.lastIndexOf("/"));
                toPath = toPath + newFrom
                let fromFile = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
                let toFile = fs.openSync(toPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                fs.copyFileSync(fromFile.fd, toFile.fd, 0)
                console.info("成功将[" + filePath + "]文件拷贝到了沙箱")
              }
            }).catch((err: BusinessError) => {
              console.error('DocumentViewPicker.select failed with err: ' + err);
            })
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
  • 点击查看U盘文件并导入到沙箱按钮后,拉起了DocumentViewPicker。

  • 点击MyUSB后可以浏览我的U盘。选中要拷贝的文件。

  • 点击完成后,成功将U盘中的两个文件拷贝到了沙箱。

更多关于HarmonyOS鸿蒙NEXT手机设备如何访问外置存储文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS NEXT中,访问外置存储文件需使用ohos.file.fs文件系统API。通过getExternalStorageDir()获取外置存储根目录路径,然后使用openSync()readSync()等接口操作文件。需在module.json5中声明ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限。注意:NEXT版本强化了沙箱机制,应用只能访问授权目录下的文件。

在HarmonyOS Next中访问外置存储文件,可以通过以下方式实现:

  1. 首先在module.json5中声明存储权限:
"requestPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "需要读取外部存储"
  },
  {
    "name": "ohos.permission.WRITE_MEDIA",
    "reason": "需要写入外部存储"
  }
]
  1. 动态申请权限:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

let atManager = abilityAccessCtrl.createAtManager();
try {
  await atManager.requestPermissionsFromUser(this.context, 
    ['ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA']);
} catch (err) {
  console.error(`权限申请失败: ${err}`);
}
  1. 获取外部存储路径并创建日志文件:
import fileIO from '@ohos.fileio';
import file from '@ohos.file.fs';

// 获取外部存储目录
let externalDir = globalThis.abilityContext.filesDir + '/../external/';

// 创建日志文件
let logFilePath = externalDir + 'app_logs.txt';
try {
  let file = fileIO.openSync(logFilePath, fileIO.OpenMode.READ_WRITE | fileIO.OpenMode.CREATE);
  fileIO.writeSync(file, '这里是日志内容...\n');
  fileIO.closeSync(file);
} catch (err) {
  console.error(`文件操作失败: ${err}`);
}
  1. 用户分享文件:
import wantConstant from '@ohos.app.ability.wantConstant';

let want = {
  action: 'ohos.want.action.sendData',
  uri: 'file://' + logFilePath,
  type: 'text/plain',
  flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION
};
await globalThis.abilityContext.startAbility(want);

注意事项:

  • 确保设备已插入外部存储
  • 文件路径可能会因设备而异
  • 需要处理权限被拒绝的情况
  • 大量日志写入建议使用异步方式,
回到顶部