其他测试框架 奇诡的 adb error,connot create file No Such file or directory

myersguo · 2017年02月24日 · 最后由 阳光下的草 回复于 2017年02月25日 · 5520 次阅读

adb error,connot create file No Such file or directory 

我在测试的时候执行:

adb push d:/a.txt /sdcard/a.txt
adb pull /sdcard/a.txt d:/b.txt

结果提示我:

adb: error: cannot create file/directory

我们看adb源码的报错位置

if (stat(dst, &st) == -1) {
    dst_exists = false;

    // If we're only pulling one path, the destination path might point to
    // a path that doesn't exist yet.
    if (srcs.size() == 1 && errno == ENOENT) {
        // However, its parent must exist.
        struct stat parent_st;
        if (stat(adb_dirname(dst).c_str(), &parent_st) == -1) {
            sc.Error("cannot create file/directory '%s': %s", dst, strerror(errno));
            return false;
        }
    } else {
        sc.Error("failed to access '%s': %s", dst, strerror(errno));
        return false;
    }
}

从代码看,如果文件不存在就会检查文件的目录是否存在,都不存在就会报错。

当我新建了此文件后,问题就不存在了。但是,

目录是存在的啊,目录不就是D:\, 换一种思路。我新建一个新的目录D:\testdir,然后执行:

adb pull /sdcard/a.txt D:\testdir\b.txt

这样就 OK 了。

WHY? 难道是 adb_dirname 不支持 disk?

正当我迟疑不解的时候,我手欠把开发者设置的 USB 调试关掉后重新打开了。然后,问题竟然没有了,然后再也出现不了了。

知觉告诉我,「一切不容易复现的问题都将复现」,但问题就是木有复现,什么原因呢?

其实问题来源于我正在写的adb helper中的测试 出现的,每次执行python test\adb_test.py都会复现这个问题。

为什么呢?

有人遇到过类似问题吗?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞

虽说 python 是支持在 windows 用 / 作为路径分隔符,但是 c++ 未必,所以推荐在 windows 还是老老实实用 \ 吧

另,adb 的 wrapper 真是好多个人写....
https://github.com/264768502/adb_wrapper

诡异的是,不是每次都报错,感觉不是「/」的问题。而执行 python 脚本时必然复现,复现后手动执行 adb pull 也会有问题。另,写 wrapper 只是自己方便。这个问题,还需后续仔细验证下原因。

shell=True -> shell=False 呢? 其实你也不会运行 cmd 里的自带命令吧
另外还是推荐 subprocess 的命令用列表的方式传进去,避免一些转义的问题

另外错误 log 不足啊
不是 sc.Error("cannot create file/directory '%s': %s", dst, strerror(errno));么
后面的 strerror(errno) 是几呢

这个我遇到过,我用了 subprocess 导致。原因是每个命令都是子线程跑,前面的命令还没完,后面的命令就开始了。避免方式,读下前面命令的输出 p.stdout.read() 保证确实跑完了。

看代码,用了 popen.commiucate,所以肯定是跑完了才会跑下一个命令

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册