收藏
回答

FileSystemManager.mkdir 在IOS真机上判断目录是否存在有误

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 Bug FileSystemManager.mkdir 微信iOS客户端 8.0.29 2.27.0

小游戏需要加载一些外部资源,首次加载资源后把文件列表存储在一个TXT文档,并且存放在 wxfile://usr/layaairGame 目录下,第二次加载会对比每一个外部资源文件和本地TXT文档中记录的缓存文件列表,如果已经存在同名文件则跳过,当外部资源URL结尾的版本号和本地记录不一样时,则会重新下载文件,并更新本地TXT,这套逻辑没有问题,用来解决资源更新的问题。

但是后续发现IOS真机小游戏,在点击右上角 【●●●】 然后点击 【重新进入小游戏】,这时会重新加载所有外部图片资源,就像是没有对比本地TXT文件一样,后续反复仔细研究代码,发现LAYA引擎的源代码中是通过 FileSystemManager.mkdir 创建一个存放缓存文件的本地临时目录,由判断目录是否存在,来判断本地 TXT文档 是否存在。

通过研究微信官方小游戏 FileSystemManager.mkdir API的文档发现,创建目录${dirPath}有同名文件或目录即返回 fail file already exists,而LAYA引擎源代码中正是通过这个API的返回字符来判断文件夹是否存在,理论上第二次加载时,目录已存在,TXT文档也存在,原代码逻辑设计的就是当目录存在则读取TXT文档,获取之前存储的缓存文件列表,再通过对比文件名实现自动跳过外部图片资源的重复加载。但是由于 mkdir IOS真机表现,在目录已存在的前提下,并没有返回 fail file already exists ,而是直接成功创建了同名的目录,导致目录存在则读取TXT的逻辑代码跳过没有执行生效,最终的表现就是虽然首次加载过外部图片资源并已记录TXT,第二次、第三次.....均会重复加载外部资源,导致200M的小游戏本地用户文件空间逐步变满,最终导致LAYA引擎内统计本地空间使用容量值出错,而缓存空间满后自动清理缓存文件的逻辑也全部失效,最终表现就是200M空间满,游戏无法正常加载资源,导致游戏无法显示图片,游戏黑屏。

贴一段LAYA引擎源代码,原来的逻辑正是通过mkdir是否能够正常创建同名目录来判断文件夹是否存在,以达到判断TXT文档是否存在的目的

fs.mkdir({dirPath: dirPath, recursive:true, success: function(data:Object):void {
 console.error('mkdir sucess');
 console.error(data);
 callBack != null && callBack.runWith([0, {data: JSON.stringify({})}]);
}, fail: function(data:Object):void {
  console.error('mkdir fail');
  console.error(data);
 if (data.errMsg.indexOf("file already exists") != -1)
  readSync(fileListName, "utf8", callBack);
 else
  callBack != null && callBack.runWith([1, data]);
}});


最后一次编辑于  2022-10-29
回答关注问题邀请回答
收藏

1 个回答

登录 后发表内容