鸿蒙应用开发之文件路径终极梳理:一张表看懂沙箱、U 盘、rawfile、datashare 到底该用哪个!
·
一、先分清 3 个视角
| 视角 | 可见范围 | 典型调试手段 |
|---|---|---|
| 应用进程 | 只能看见自己的沙箱 | DevEco 或 hdc shell 进入 /data/storage/el[12]/base/... |
| 系统进程 (init、filemanager、mediaprovider) | 全局可见 | hdc shell 进入真实物理路径 |
| 用户空间(PC/U 盘/网盘) | 通过 MTP、USB Mass-Storage 暴露 | 插在电脑上直接看 |
二、OpenHarmony 里“路径”
1. 沙箱路径(Sandbox Path)(每个APP自己的路劲,其他APP无法访问)
- 定义:应用唯一可主动读写的目录,内核挂载时通过
namespace+bind mount隔离。 - 根前缀:
el1(设备级加密):/data/storage/el1/base/<bundleName>/el2(用户级加密):/data/storage/el2/base/<bundleName>/
- 常用子目录(由
Context提供):filesDir → /data/storage/el2/base/files cacheDir → /data/storage/el2/base/cache tempDir → /data/storage/el2/base/temp databaseDir → /data/storage/el2/base/databases preferencesDir → /data/storage/el2/base/preferences distributedfiles →/data/storage/ el2/distributedfiles(分布式融合目录) - 特点:
- 不需要任何权限;
- 卸载 App 时自动整棵删除;
- 若备份恢复,el2 目录会跟随用户账号走,el1 不跟。
2. 物理路径(Physical Path)(不提供给APP访问)
- 定义:系统全局的真实 inode 路径,供 shell、filemanagerd、init 使用。
- 与沙箱对照(以包名
com.example.demo为例):
数字沙箱: /data/storage/el2/base/com.example.demo/files/a.txt 物理: /data/app/el2/100/base/com.example.demo/files/a.txt 比如/system/app/,/vendor等这些开发板的路劲,通常系统会不提供直接访问物理路劲的权限100是用户号(UserId),多用户场景下递增。 - 注意:
- 应用代码若硬编码物理路径,在 SELinux 策略下会被
deny; - 只有
filemanagement系统服务具有rwx能力。
- 应用代码若硬编码物理路径,在 SELinux 策略下会被
3.公共目录路劲(比如文件管理器、相册这些所有应用都可以申请权限来访问的路劲)
用户文件路径(公共目录)特点:用户可见(如相册、文档),需权限声明。
媒体文件访问 接口:使用@kit.MediaLibraryKit模块。 示例(访问相册):
import { photoAccessHelper } from '@kit.MediaLibraryKit';
const photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(photoSelectOptions); // 需声明ohos.permission.READ_MEDIA权限
文档文件访问 接口:通过@kit.FileManagementKit选择用户文件。
权限:需在module.json5中声明ohos.permission.WRITE_MEDIA。
4. File URI(file://)
- 官方格式:
例:file://<bundleName>/<path-relative-to-sandbox>file://com.example.demo/files/music.mp3 - 使用场景:
- 同一设备内 Ability 之间通过
startAbility分享文件; - 配合
want.flags.FLAG_AUTH_READ_URI_PERMISSION临时授权。
- 同一设备内 Ability 之间通过
- 限制:
- 不接受绝对物理路径;
- 跨设备无效。
5. HTTP/HTTPS URI
- 网络路径:标准 RFC 3986,无特殊改造。
- 组件:
@ohos.net.http模块直接支持;- 若下载到本地,需自己写入沙箱后再做后续业务。
- 权限:需要
ohos.permission.INTERNET。
6. DataShare URI(datashare://)
- 来源:由系统 FilePicker、MediaLibrary 返回,例如:
datashare://media/external/audio/media/45 - 实质:底层仍映射到 MediaProvider 的
MediaStore表,通过openFile拿到 fd。 - 优点:
- 用户授权一次后,应用即可获得只读/读写 fd;
- 可播放 U 盘、OTG 文件,无需自己解析
/storage/External/xxx。
- 用法:
avPlayer.urlSrc = 'datashare://media/...'; // 支持
7. RawFile 路径(resource/rawfile)
- 定义:HAP 包内随包携带的只读资源,编译时打包到HAP中,不可修改。
- 路径写法:无真实路径,通过
$rawfile('intro.mp3')访问。 - 编译期打包到
resources.index,运行时由ResourceManager解析成 fd 返回。
8. 分布式路径(Distributed File)
- 根目录:
/data/storage/el2/distributedfiles - 机制:基于软总线+DTP 协议,把多设备目录聚合为同一命名空间。
- 表现:
- 在 A 设备写入
el2/distributedfiles/a.txt; - 同一账号的 B 设备可在相同路径看到该文件(网络可达时自动同步)。
- 在 A 设备写入
- 限制:
- 仅 el2 加密等级;
- 需要
ohos.permission.DISTRIBUTED_DATASYNC。
9. U 盘/OTG 路径(External Storage)
- 挂载点(OpenHarmony 5.1 代码位于
foundation/filemanagement/storage_service):/mnt/media_rw/5466-EB23 // vfat 卷 UUID /storage/External/5466-EB23 // 应用可见的 FUSE 视图 - 访问方式:
- 系统文件管理器:直接通过
filemanager进程可读写; - 第三方应用:不能直接用
/storage/External/...路径读写; - 正确姿势:通过
FilePicker拿到datashare://URI,再fs.open获得 fd。
- 系统文件管理器:直接通过
10. App-Linking URI(https://)
- 功能:OpenHarmony 5.1 引入,对标 Android App Linking。
- 格式:普通 HTTPS URL,例如:
https://www.example.com/news/123 - 流程:
- 开发者把
assetlinks.json放到域名.well-known; - 系统校验通过后,自动把链接分发到对应 Ability;
- 未安装应用时回落浏览器。
- 开发者把
- 区别于 DeepLink:增加域名所有权校验,防劫持。
三、一张表速查
| 类型 | 典型前缀 | 应用能否直接读写 | 跨设备 | 备注 |
|---|---|---|---|---|
| 沙箱路径 | /data/storage/el2/base/... |
✅ 自由读写 | ❌ | 卸载即删 |
| 物理路径 | /data/app/el2/100/... |
❌ 权限拒绝 | ❌ | 仅系统可见 |
| file URI | file://<bundle>/files/... |
✅ 通过 fd | ❌ | 用于分享 |
| http URI | http:///https:// |
✅ 只读网络 | ✅ | 需 INTERNET 权限 |
| DataShare URI | datashare://media/... |
✅ 只读/写 | ❌ | 由 FilePicker 返回 |
| rawfile | $rawfile('xxx') |
✅ 只读 | ❌ | 打包进 HAP |
| 分布式路径 | /data/storage/el2/distributedfiles |
✅ 读写 | ✅ | 需分布式权限 |
| U 盘路径 | /storage/External/xxxx |
❌ 应用不可直接访问 | ❌ | 用 FilePicker 中转 |
| App-Linking | https:// |
✅(跳转) | ✅ | 需域名验证 |
四、开发提示
- 永远把业务文件放进沙箱,再视需求通过
file://或datashare://分享。 - 播放 U 盘音视频不要拼路径,统一用
FilePicker拿datashare://URI,然后urlSrc=uri。 - 需要跨设备同步时,直接把文件写到
distributedfiles目录即可,系统负责差分同步。 - 发布开源发行版时,SELinux 策略会收紧,任何硬编码物理路径都有高概率被否决
更多推荐



所有评论(0)