FileNotFoundException: open failed: ENOENT (No such file or directory) 问题解决方案

这个问题定位了大半天,先坐下记录。可能每个人遇到的问题情况不一样,我先说下我出现的问题解决方案:将mkdir() 改成mkdirs() ,至于为什么,后面介绍。

今天测试找我,说项目中测试录像直接crash了。我一脸懵圈,之前不都好好的吗?这个项目之前别人在负责,之前也测试过没问题。负责人离职后代码移交给我了,怎么到我手上就有问题?我很郁闷的重现了下,还真是的!!!我思考了一下,我没改这块代码啊,然后我update一份同事最后提交的版本代码,发现也有这个问题,这让我更不理解了,为啥?为啥?为啥?

这块代码一直没动,测试手机也是一样的,不应该啊,最后我猜测可能是升级AS造成的,后面有空再去证实吧。

好了,废话说到这,开始说正题:

既然有bug,那就去解决,既然能复现,那就看日志。从报错日志里我找到了FileNotFoundException: open failed: ENOENT (No such file or directory)。这很明显是文件找不到啊,可是为什么呢?首先这是录像时报的错,那么录像找不到文件,就是说跟读写文件有关。

第一步,看到这个日志,我的第一反应是权限申请了吗?我仔细的看了下,权限有申请啊,AndroidManifest里面有权限申请,因为手机是Android6.0以上,所以我又看了下动态权限申请,也有啊,没毛病。并且我从手机设置中查看了,已经有存储权限了。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第二步,既然权限已经申请了,那是路径问题?好吧,再看路径。代码是通过获取手机SD的存储路径,获取的路径也没有毛病啊。代码如下:

第三步,既然这两个解决方案都没用,那么只能debug一步一步来了。我在debug下运行,发现报错的地方是这里:

那既然报错了,肯定是文件不存在或者无效了,那文件在什么地方创建的呢,当我找到文件创建的地方,打印了创建文件的结果,发现一直是false。

当我把mkdir()替换成mkdirs(),问题完美解决。他们的区别:

mkdir() 创建此抽象路径名称指定的目录(及只能创建一级的目录,且需要存在父目录)

mkdirs() 创建此抽象路径指定的目录,包括所有必须但不存在的父目录。(及可以创建多级目录,无论是否存在父目录)

到此,问题解决了,如果有疑问欢迎讨论。

发布了2 篇原创文章 · 获赞 1 · 访问量 66

猜你喜欢

转载自blog.csdn.net/lansebingkuai/article/details/105291838