在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().cacheDirfilesDir写副本并设置宽松权限:

// 将需导出文件拷贝到可访问位置并设权限
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 is sending or deleting file now

另一 hdc 进程占用 → hdc kill重试

no such file or directory(路径含 file://media/Photo/…

媒体库不能用 file recv → 用 mediatool recv先导 /data/local/tmp

permission denied(沙箱 files 下文件)

应用内 copy 到 cacheDir + chmod 644,再 recv

no such file or directory(data/log/hilog/…)

hilog未开启持久化 或 hdc版本过低 → 升级hdc、确认日志存在

自定义 open() 创建文件后仍 deny

`open(fd, O_CREAT


四、总结:hdc file recv 排查 SOP

  1. 媒体库图片/视频​ → mediatool querymediatool recv/data/local/tmphdc file recv

  2. 应用沙箱文件​ → App内拷贝到 cacheDir+ chmod 0644hdc file recv cacheDir下文件

  3. hdc 忙​ → hdc kill重连

  4. hilog/系统文件​ → 确认设备日志开关开启 + hdc版本匹配设备API

  5. 权限仍拒绝​ → 确认文件 mode 含 group-read (S_IRGRP)

核心法则:HarmonyOS 6 中 hdc file recv只能操作普通文件系统路径且有读权限,媒体库路径走 mediatool、应用沙箱文件先导出到 cacheDir再拉。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任。

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐