背景
某天下午,正常使用Unity发包,编译资源时,突然报错。Win32 IO returned 1224。没有修改任何编译相关的代码,而且前几个小时,还能正常打包。以下是报错截图。
历程
经过搜索知,unity IO 报错1224代表,IO访问文件时,该文件被其他进程占用。参考链接
由此作为线索,查询该文件被什么进程占用了。查询进程占用方法链接。但是并没有找到任何正在执行的进程。而且最近又没有改过任何编译资源相关的代码。
重启引擎,关机重启,换了磁盘,尝试用进程工具解锁,均无果。试了几个月前无任何修改的的老工程,也是同样的报错表现。
由此排除绝对不是某个常规进程占用了。
后续在运维的协助下,看到Windows10在几个小时前有更新补丁,由此转为排查是否是系统更新引起。
最终发现是,WindowsDefender主动防御系统更新后,可能改动了自动扫描文件的机制引起的。
猜测:新的机制中,系统中每新建一个文件,新的病毒检测系统,立即就去检查该文件是否有病毒,此时应该会占用IO权限,如果这时Unity使用IO流再访问就会报错。
比如 IO.Create之后直接调用IO.Write或IO.Copy,极有概率复现该问题。
解决方案
解决方案有两个,第一个比较简单:关闭所有的自动检测。但是要注意,关闭了病毒检测,会有被攻击风险。而且系统设置中标明了,该机制后续有可能还会自动打开,治标不治本。
第二个,修改系统自带的病毒扫描过滤列表,即,将Unity工程文件夹和Unity进程都加到过滤列表中去。
建议将所有的工程放到一个大的文件夹中,不然工程放的比较散,每一个工程,都要添加一个过滤路径。不过如果选中的文件夹比较大的话,点击添加之后,系统会反应很久很久才会刷新列表。
第一步,找到设置中的如下位置。
第二步,按类型添加。
第三步,添加结果如下。PS:文件夹比较大就没有添加。因为我工程中编译输出的文件都是.unity3d类型的,使用后缀完全够用。
文章对你有帮助么,点个赞可以嘛。攒攒人气,谢谢啦。