HarmonyOS 6商城开发学习:hdc file recv拉取设备文件失败——媒体库/沙箱权限/hdc版本排查SOP
在HarmonyOS 6购物比价或电商类应用开发中,你用 hdc file recv从真机拉取截图、数据库或日志文件时,常遇到四类失败:命令报 hdc is sending or deleting file now, please wait...、媒体库目录报 no such file or directory、应用沙箱文件报 permission denied、hilog日志目录报找不到文件。这不是hdc坏了,而是对应路径访问受限或hdc版本不匹配。
本文将结合官方购物比价行业FAQ,完整梳理四种失败场景的根因与正确替代命令。
一、现象:四类典型失败现场
场景一:hdc 报忙
hdc file recv /data/app/el2/100/base/com.xxx/files/test.txt ./
# [Fail]Error: hdc is sending or deleting file now, please wait...
根因:同台PC上一个hdc会话正在执行 file send/recv/shell,当前命令被阻塞。
场景二:直接拉媒体库图片
hdc file recv "file://media/Photo/147/IMG_1751371660_141/IMG_141.png" ./
# [Fail]Error opening file: no such file or directory
根因:hdc file recv不支持从媒体库(Gallery Provider)URI路径读取文件,媒体文件由媒体框架管理,不走普通文件系统路径。
场景三:拉应用沙箱文件报权限拒绝
hdc file recv /data/app/el2/100/base/com.example.shop/files/user.db ./
# [Fail]Error opening file: permission denied
根因:应用沙箱 /data/app/…/files/对其他UID不可读;若你自己应用内 open()创建文件时 mode 缺 S_IRGRP也会导致hdc无法读。
场景四:拉 data/log/hilog/ 报不存在
hdc file recv data/log/hilog/ ./
# [Fail]Error opening file: no such file or directory
根因:常是 hdc 版本低于设备 API 版本,或日志已被老化清理/未开启 hilog 持久化。
二、解决方案逐一对应
场景一:hdc 忙——等待或重启
-
等待当前传输完成即可
-
僵死不结束:
hdc kill→ 重开终端再试
hdc kill
hdc list targets # 确认设备重连
hdc file recv /path/on/device /local/path
场景二:媒体库文件——用 mediatool导出再 recv
Step 1 查媒体文件 URI(在设备 shell 中或连跑):
hdc shell mediatool query IMG_141.jpg -u
# 返回:file://media/Photo/147/IMG_1751371660_141/IMG_141.jpg
Step 2 导出到临时目录(设备端):
hdc shell mediatool recv "file://media/Photo/147/IMG_1751371660_141/IMG_141.jpg" /data/local/tmp/out_shot.jpg
Step 3 用 file recv 拉出:
hdc file recv /data/local/tmp/out_shot.jpg ./
✅ 这是官方推荐替代方案,禁止直接
hdc file recv file://media/...
场景三:应用沙箱文件权限
方式A(推荐调试期):应用内用 getContext().cacheDir或 filesDir写副本并设置宽松权限:
// 将需导出文件拷贝到可访问位置并设权限
import { fileIo } from '@kit.CoreFileKit';
const src = getContext().filesDir + '/user.db';
const dst = getContext().cacheDir + '/user_export.db';
fileIo.copyFile(src, dst);
// open+write时 mode 包含 S_IRGRP (0644)
fileIo.chmod(dst, 0o644); // rw-r--r--
然后:
hdc file recv /data/app/el2/100/base/<bundle>/cache/user_export.db ./
方式B(run-as 类思路受限):HarmonyOS 应用非debug签名时不能用 run-as;debug签名包可在 shell 中以应用 UID 访问自身沙箱,但仍建议用方式A导出到 cacheDir。
场景四:hilog 日志 / 版本不匹配
-
确认设备已开启 hilog 持久化(开发者选项中"记录系统日志"开启)
-
确认
hdc -v版本与设备 HarmonyOS SDK 版本匹配(建议升到最新 DevEco Device Tool / Command Line Tools) -
日志路径示例(需 root/Shell 权限可访问):
hdc shell ls -l /data/log/hilog/
hdc file recv /data/log/hilog/hilog.20260429.001.gz ./
三、避坑速查表
|
你看到的错误 |
先查 |
|---|---|
|
|
另一 hdc 进程占用 → |
|
|
媒体库不能用 file recv → 用 |
|
|
应用内 copy 到 cacheDir + chmod 644,再 recv |
|
|
hilog未开启持久化 或 hdc版本过低 → 升级hdc、确认日志存在 |
|
自定义 open() 创建文件后仍 deny |
`open(fd, O_CREAT |
四、总结:hdc file recv 排查 SOP
-
媒体库图片/视频 →
mediatool query→mediatool recv到/data/local/tmp→hdc file recv -
应用沙箱文件 → App内拷贝到
cacheDir+chmod 0644→hdc file recv cacheDir下文件 -
hdc 忙 →
hdc kill重连 -
hilog/系统文件 → 确认设备日志开关开启 + hdc版本匹配设备API
-
权限仍拒绝 → 确认文件 mode 含 group-read (
S_IRGRP)
核心法则:HarmonyOS 6 中 hdc file recv只能操作普通文件系统路径且有读权限,媒体库路径走 mediatool、应用沙箱文件先导出到 cacheDir再拉。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任。
更多推荐


所有评论(0)