鸿蒙Next如何读写外部存储

在鸿蒙Next系统中,如何实现对外部存储(如SD卡或U盘)的读写操作?需要哪些权限或API?是否有具体的代码示例或最佳实践?

2 回复

鸿蒙Next读写外部存储?简单说就是:先申请权限,再操作文件。用@ohos.file.fs模块,比如fs.copyFile()复制文件,fs.readText()读文本。记得在module.json5里声明存储权限,不然系统会傲娇地拒绝你。注意:别乱删用户照片,否则手机会哭的。

更多关于鸿蒙Next如何读写外部存储的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS NEXT)中,读写外部存储(如SD卡或共享存储空间)需要通过权限申请和文件管理API实现。以下是具体步骤和示例代码:

1. 权限申请

module.json5配置文件中声明存储权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "需要读取外部存储文件"
      },
      {
        "name": "ohos.permission.WRITE_MEDIA",
        "reason": "需要写入外部存储文件"
      }
    ]
  }
}

2. 动态权限申请

在代码中动态请求用户授权:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';

// 获取上下文
let context: common.Context = getContext(this) as common.Context;

// 检查并申请权限
async function requestPermissions() {
  let atManager = abilityAccessCtrl.createAtManager();
  let permissions = ['ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA'];
  
  try {
    let result = await atManager.requestPermissionsFromUser(context, permissions);
    if (result.authResult === 0) {
      console.log("权限授权成功");
    } else {
      console.log("权限授权失败");
    }
  } catch (err) {
    console.error(`权限申请异常: ${err.code}, ${err.message}`);
  }
}

3. 读写文件操作

使用@ohos.file.fs@ohos.file.environment进行文件管理:

示例:写入文件到外部存储

import fs from '@ohos.file.fs';
import environment from '@ohos.file.environment';

// 获取外部存储目录路径
let dirPath: string = environment.getExternalStorageDir() + "/Documents";

// 创建文件路径
let filePath: string = dirPath + "/test.txt";

try {
  // 写入文件
  let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  fs.writeSync(file.fd, "Hello, HarmonyOS!"); // 写入内容
  fs.closeSync(file); // 关闭文件
  console.log("文件写入成功");
} catch (err) {
  console.error(`写入失败: ${err.code}, ${err.message}`);
}

示例:从外部存储读取文件

try {
  let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
  let buf = new ArrayBuffer(1024);
  let readLen = fs.readSync(file.fd, buf); // 读取内容到缓冲区
  let content = String.fromCharCode.apply(null, new Uint8Array(buf.slice(0, readLen)));
  fs.closeSync(file);
  console.log("文件内容: " + content);
} catch (err) {
  console.error(`读取失败: ${err.code}, ${err.message}`);
}

注意事项:

  1. 权限依赖:确保用户已授权,否则会抛出安全错误。
  2. 路径处理:使用getExternalStorageDir()获取标准外部存储路径,避免硬编码。
  3. 错误处理:所有文件操作需用try-catch包裹,防止崩溃。

以上代码基于HarmonyOS NEXT API 10+,实际开发时请根据SDK版本调整。

回到顶部