/// <summary> /// 解析本地版本文件 /// </summary> /// <param name="bytes"></param> public static void ParseLocalVersionFile(byte[] bytes) { byte[] rawBytes = GZipFileUtil.Uncompress(bytes); string dataStr = Encoding.UTF8.GetString(rawBytes); _localFileDic = new Dictionary <string, FileVerInfo>(); _cacheFileDic = new Dictionary <string, FileVerInfo>(); string[] splitStr = new string[] { "\n" }; string[] data = dataStr.Split(splitStr, StringSplitOptions.None); char[] fileVerSplit = new char[] { ':', '|' }; foreach (string fileVerStr in data) { string[] fileVer = fileVerStr.Split(fileVerSplit); if (fileVer.Length < 3) { continue; } FileVerInfo info = new FileVerInfo(); info.relativePath = fileVer[0]; info.absolutePath = Path.Combine(AssetPathUtil.StreamingAssetPath, info.relativePath); info.md5Code = fileVer[1]; info.size = uint.Parse(fileVer[2]); _localFileDic.Add(info.relativePath, info); } }
private void OnNewResLoadComplete(object content) { WWW www = content as WWW; FileVerInfo loadedFile = _loadFileDic[www.url]; string relativePath = loadedFile.relativePath; string outputPath = AssetPathUtil.PersistentDataPath + relativePath; using (FileStream fileStream = System.IO.File.Create(outputPath)) { fileStream.Write(www.bytes, 0, www.bytes.Length); fileStream.Flush(); fileStream.Close(); } VersionManager.AddCacheFileInfo(loadedFile); _loadedCount++; _loadingView.SetPercent((float)_loadedCount / _totalCount - 0.01f); if (_loadedCount == _totalCount) { _isStartUpdate = false; _loadingView.SetTitle("正在解压资源,不消耗任何流量。"); VersionManager.localVersion = VersionManager.remoteVersion; VersionManager.SaveCacheVersionFile(false); StartGame(); } }
/// <summary> /// 获取资源的绝对路径 /// </summary> /// <param name="relativePath"></param> /// <returns></returns> public static string GetPath(string relativePath) { if (_localFileDic == null) { return(""); } if (!_localFileDic.ContainsKey(relativePath)) { Debug.LogWarning("Not Exist " + relativePath); return(""); } FileVerInfo info = _localFileDic[relativePath]; return(info.absolutePath); }
//添加本地文件信息 public static void AddCacheFileInfo(FileVerInfo info) { if (_localFileDic.ContainsKey(info.relativePath)) { _localFileDic[info.relativePath] = info; } else { _localFileDic.Add(info.relativePath, info); } if (_cacheFileDic.ContainsKey(info.relativePath)) { _cacheFileDic[info.relativePath] = info; } else { _cacheFileDic.Add(info.relativePath, info); } }
/// <summary> /// 解析CDN版本文件获取热更新文件表 /// </summary> /// <param name="bytes"></param> public static List <FileVerInfo> ParseRemoteVersionFile(byte[] bytes) { List <FileVerInfo> downLoadList = new List <FileVerInfo>(); byte[] rawBytes = GZipFileUtil.Uncompress(bytes); string dataStr = Encoding.UTF8.GetString(rawBytes); string[] splitStr = new string[] { "\n" }; string[] data = dataStr.Split(splitStr, StringSplitOptions.None); char[] fileVerSplit = new char[] { ':', '|' }; foreach (string fileVerStr in data) { string[] fileVer = fileVerStr.Split(fileVerSplit); if (fileVer.Length < 3) { continue; } FileVerInfo info = new FileVerInfo(); info.relativePath = fileVer[0]; info.absolutePath = AssetPathUtil.PersistentDataPath + info.relativePath; info.md5Code = fileVer[1]; info.size = uint.Parse(fileVer[2]); if (_localFileDic.ContainsKey(info.relativePath)) { FileVerInfo localFileInfo = _localFileDic[info.relativePath]; if (localFileInfo.md5Code != info.md5Code) { downLoadList.Add(info); } } else { downLoadList.Add(info); } } return(downLoadList); }
/// <summary> /// 解析缓存版本文件 /// </summary> /// <param name="bytes"></param> public static void ParseCacheVersionFile(byte[] bytes) { string dataStr = Encoding.UTF8.GetString(bytes); string[] splitStr = new string[] { "\n" }; string[] data = dataStr.Split(splitStr, StringSplitOptions.None); //第一段为缓存版本号 cacheVersion = data[0]; if (!CheckCacheVersionIsOld()) { char[] fileVerSplit = new char[] { ':', '|' }; int fileVerCount = data.Length; for (int i = 1; i < fileVerCount; i++) { string[] fileVer = data[i].Split(fileVerSplit); if (fileVer.Length < 3) { continue; } FileVerInfo info = new FileVerInfo(); info.relativePath = fileVer[0]; info.absolutePath = AssetPathUtil.PersistentDataPath + info.relativePath; info.md5Code = fileVer[1]; info.size = uint.Parse(fileVer[2]); _cacheFileDic.Add(info.relativePath, info); Debug.Log(info.relativePath + "in the cache"); if (_localFileDic.ContainsKey(info.relativePath)) { _localFileDic[info.relativePath] = info; } else { _localFileDic.Add(info.relativePath, info); } } } }