FileUtils在安卓中判断文件夹是否存在非常耗时

我有如下需求,在安卓中需要判断某个文件夹是否存在,没有我就会去服务器上下载对应的资源

在cocos2dx3.7的引擎中,通过FileUtils::isDirectoryExist函数
发现实现代码是很简单的调用linxu的api实现的

速度也比较快

但是我更新到3.11.1引擎后,发现判断速度变的很慢,查看源码发现,新引擎中有打开文件夹的操作


这个IO操作非常消耗时间,以至于如果文件夹判断的数量多了以后,UI线程就会阻塞

所以我想问下
新引擎中为何判断文件夹存在会有打开文件夹的IO操作?
同时我的需求应该如何使用代码才能保证不会阻塞UI线程?

这段代码是判断apk里的资源是否存在的。在APK里的资源是没有被解压出来的。如果是一个可访问的文件夹路径的话,在上面的逻辑就直接返回了。

这个是在渲染线程完成的,不是在UI线程。我看看是否有更高效的方法。

没有别的办法可以判断了。这里的AssetsManager是一个缓存的文件描述符,和每次打开一个磁盘上的文件夹是不一样的,类似于缓存的概念,速度不会慢。

你说很耗时,有数据吗?

有数据的

通过截图可以看到,当判断一个文件夹是否存在时,需要耗时500多毫秒才会进行下一个文件夹的判断

我的测试机型是华为G750-T01
Android版本是4.4.2

移除掉了中间可能会比较耗时的io操作
发现在判断两个路径时,确实会有耗时非常高的现象

代码如下,是在同一个if语句中进行的判断,中间没有进行其他操作
if ((pFileUtils->isDirectoryExist(strLocalResPath) || pFileUtils->isDirectoryExist(strDownloadResPath)) || (0 == GameKindEx.dwAppVersion && '\0' == GameKindEx.szAppDownloadURL[0]))

嗯,这里判断文件夹是否存在主要从地方搜索:

  • 物理文件夹
  • APK包

这里慢的原因是APK包判断比较慢,而你的需求是不需要搜索APK包的。但是我不能修改这个函数的逻辑,否则就破坏兼容性了。能做的只能是在FileUtilsAndroid添加新的函数不搜索APK包。

传入一个绝对路径就可以了吧

@ourbrander 是的,不过当前的实现有问题,传绝对路径也会搜索APK包。我会提交修改。