在 HarmonyOS/OpenHarmony 应用开发中,使用 @kit/file
模块 的 FileIO 接口操作文件时,是否需要权限取决于访问的文件路径类型。以下是详细的权限规则说明:
一、权限规则总结
文件路径类型 | 操作方式 | 是否需要权限 |
---|---|---|
应用私有目录 | 读写、删除、创建文件 | 不需要(默认拥有完整权限) |
公共目录 | 访问用户媒体文件(如图库) | 需要动态申请权限(如 ohos.permission.READ_MEDIA ) |
外部存储根目录 | 访问 SD 卡或其他设备存储 | 需要权限且受系统限制(通常不允许普通应用直接访问) |
二、应用私有目录(无需权限)
1. 目录路径示例
- 内部存储:
internal://app/files/
(持久化存储)internal://app/cache/
(临时缓存)
- 数据库文件:
internal://app/database/
2. 代码示例
import fileIO from '@kit.file.fileIo';
// 在私有目录创建文件(无需权限)
const privatePath = 'internal://app/files/example.txt';
fileIO.openSync(privatePath, fileIO.OpenMode.READ_WRITE | fileIO.OpenMode.CREATE);
fileIO.writeSync(fd, 'Hello HarmonyOS');
fileIO.closeSync(fd);
三、公共目录(需要权限)
1. 公共目录路径示例
- 用户媒体目录:
media://photos/
(相册)、media://videos/
- 下载目录:
downloads://
2. 所需权限
- 读取公共文件:
ohos.permission.READ_MEDIA
- 写入公共文件:
ohos.permission.WRITE_MEDIA
3. 动态申请权限
在 module.json5
中声明权限:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "需要访问相册照片"
}
]
}
}
代码中动态申请:
import abilityAccessCtrl from '@kit.abilityAccessCtrl';
async function requestMediaPermission() {
const permissions: Array<string> = ['ohos.permission.READ_MEDIA'];
const atManager = abilityAccessCtrl.createAtManager();
try {
const result = await atManager.requestPermissionsFromUser(globalThis.context, permissions);
if (result.authResults[0] === 0) {
console.log('权限已授予');
}
} catch (err) {
console.error('权限申请失败:', err);
}
}
四、外部存储根目录(受限访问)
1. 路径示例
- SD 卡路径:
storage://sdcard/
2. 权限限制
- 普通应用:无法直接访问外部存储根目录(需系统应用签名权限)。
- 替代方案:通过
FilePicker
让用户主动选择文件,获取临时授权 URI。
五、FileIO 操作文件完整流程
六、常见问题
1. 为何操作私有目录无需权限?
- 应用私有目录由系统隔离管理,其他应用无法访问,因此无需额外权限。
2. 如何安全删除私有文件?
- 直接使用 FileIO 接口,无需权限:
fileIO.unlinkSync('internal://app/files/old_data.txt');
3. 用户拒绝权限后如何降级处理?
- 提供替代方案(如使用默认图片):
if (hasMediaPermission) { fileIO.openSync('media://photos/user_avatar.jpg', fileIO.OpenMode.READ_ONLY); } else { // 使用默认头像 const defaultAvatar = 'internal://app/files/default_avatar.png'; }
七、最佳实践
- 优先使用私有目录:除非必要,避免访问公共目录以减少权限依赖。
- 按需申请权限:在用户触发操作时申请权限(如点击“选择照片”按钮)。
- 错误处理:捕获
FileIO
操作中的异常:try { fileIO.copySync(srcPath, destPath); } catch (err) { console.error('文件操作失败:', err.code, err.message); }
通过合理规划文件存储位置和权限管理,可以确保应用既符合 HarmonyOS 的安全规范,又能提供流畅的用户体验。