// 获取需要更新的资源路径 private void GetUpdateResPaths(ResListInfo onlineResListInfo, ResListInfo curResListInfo, ref List <SingleResInfo> updateList) { if (curResListInfo != null) { if (!onlineResListInfo.Ver.Equals(curResListInfo.Ver)) { // TODO 需要测试一下Linq性能 updateList = onlineResListInfo.Info.Where(onlineData => !curResListInfo.Info.Where(curData => onlineData.Md5 == curData.Md5 && onlineData.Path == curData.Path && onlineData.Status == curData.Status && onlineData.Size == curData.Size).Any()).ToList(); } else { foreach (var item in onlineResListInfo.Info) // TODO 检测文件是否需要更新的计算方式 感觉不是很好(后续有更好的方案再改) { stringBuilder.Clear(); stringBuilder.Append(PathUtility.Instance.GetPersistentDataPath()); stringBuilder.Append("/"); stringBuilder.Append(item.Path); string localFileMd5 = ToolUtility.GetFileMD5Str(stringBuilder.ToString()); if (localFileMd5 != item.Md5) { updateList.Add(item); } } } } else { updateList.AddRange(onlineResListInfo.Info); } }
// 下载资源列表文件 public async void DownloadResListFile() { using (UnityWebRequest webRequest = new UnityWebRequest($"{PathUtility.Instance.GetResListFileUrl()}/{m_ResListFileName}")) { await webRequest.SendWebRequest(); if (webRequest.isDone && !webRequest.isNetworkError) { ResListInfo onlineResListInfo = ResListInfo.Descriptor.Parser.ParseFrom(webRequest.downloadHandler.data) as ResListInfo; List <SingleResInfo> updateList = new List <SingleResInfo>(onlineResListInfo.Info.Count); // 预先设置容量 FileStream fs = new FileStream(PathUtility.Instance.GetResListFilePath(), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); if (File.Exists(PathUtility.Instance.GetResListFilePath())) // 之前更新过小版本 { int count = (int)fs.Length; byte[] fileData = new byte[count]; fs.Read(fileData, 0, count); ResListInfo curResListInfo = ResListInfo.Descriptor.Parser.ParseFrom(fileData) as ResListInfo; GetUpdateResPaths(onlineResListInfo, curResListInfo, ref updateList); } else // 第一次更新小版本 { GetUpdateResPaths(onlineResListInfo, null, ref updateList); } ModifyLocalResFile(updateList, () => { byte[] onlineData = onlineResListInfo.ToByteArray(); fs.Write(onlineData, 0, onlineData.Length); fs.Seek(0, SeekOrigin.Begin); fs.Close(); fs.Dispose(); }); } else { DebugUtility.Instance.Error("请求资源列表文件失败,失败原因为: " + webRequest.error); } } }