【发布时间】:2020-09-23 18:02:59
【问题描述】:
我确实通过 Crashlytics 收到报告,当我致电 FileInfo.Length; 时,我的 Unity 应用程序的一些用户(大约 0.5%)会收到 UnauthorizedAccessException
堆栈跟踪的有趣部分是:
Non-fatal Exception: java.lang.Exception
UnauthorizedAccessException : Access to the path '/storage/emulated/0/Android/data/com.myCompany.myGreatGame/files/assets/myAsset.asset' is denied.
System.IO.__Error.WinIOError (System.IO.__Error)
System.IO.FileInfo.get_Length (System.IO.FileInfo)
对应的文件(每个报告的文件不同)是由同一个应用程序写入(或当前正在写入)的(可能是之前的许多会话)。该调用发生在后台线程中,并且可能同时进行一些写入。但是根据.net doc,这个属性应该被预先缓存(见https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo.length?view=netframework-2.0)
导致它的整个代码是:
private static long DirSize(DirectoryInfo d)
{
long size = 0;
FileInfo[] fileInfos = d.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
size += fileInfo.Length;
}
...
有没有人遇到过类似的事情并知道可能是什么原因造成的?
【问题讨论】:
-
问题肯定出在 C# 中吗?我问是因为错误提到了 java(也有一个阿联酋)
-
我相信它是 C# - 它总是在堆栈跟踪中显示 java.lang.Exception - 也适用于我所有可能与 Firebase/Crashlytics/Unity 相关的其他异常。之前的方法也来自我的 C# 代码。
-
请添加完整的代码或至少告诉具有
d的值或更确切地说是您要访问的确切文件?好吧,是的,您同时尝试编写也可能是一个问题