public void InitFileMapInfo(FileMapSystem sys) { if (sys == null) { return; } Dir = sys.Dir; _FileMapInfoFileName = sys.FileMapInfoFileName; FileInfo = sys.FileInfo; RecalFileInfo2NameMap(); }
public Dictionary <string, FileMapGroupDesc> GetMissFileMaps(FileMapSystem other) { var dic = new Dictionary <string, FileMapGroupDesc>(); void Add2Dic(FileMapInfo mapInfo) { var key = mapInfo.GetMappedFileName(); //判断本地成功下载了没有 if (!dic.TryGetValue(key, out var desc)) { desc = new FileMapGroupDesc { Md51 = mapInfo.MapedFileName_MD51, Md52 = mapInfo.MapedFileName_MD52 }; dic.Add(key, desc); } desc.FileMapInfos.Add(mapInfo); } foreach (var fileMapInfoIter in other.FileNameToMD5Name) { var fileName = fileMapInfoIter.Key; var newInfo = fileMapInfoIter.Value; if (!FileNameToMD5Name.TryGetValue(fileName, out var oldInfo)) { Add2Dic(newInfo); } else { if (oldInfo.FileData_MD51 != newInfo.FileData_MD51 || oldInfo.FileData_MD52 != newInfo.FileData_MD52) { Add2Dic(newInfo); } } } //更新大小 foreach (var fileMapInfoIter in other.FileNameToMD5Name) { var newInfo = fileMapInfoIter.Value; var key = newInfo.GetMappedFileName(); if (dic.TryGetValue(key, out var desc)) { desc.Len += newInfo.Len; } } return(dic); }
public static FileMapSystem CreateFromPersistAssetFile(string Dir) { var FileMap = new FileMapSystem(Dir); var bs = UnityPersistFileHelper.ReadPersistAssetFileAllBytes(Dir, FileMap.FileMapInfoFileName); if (bs == null || bs.Length == 0) { return(null); } FileMap.InitFileMapInfo(bs); return(FileMap); }
public static FileMapSystem CreateFromStreamAssetFile(string Dir) { var FileMap = new FileMapSystem(Dir); var bs = UnityStreamingFileHelper.ReadStreamAssetFileAllBytes(Dir, FileMap.FileMapInfoFileName); if (bs == null || bs.Length == 0) { //Debug.LogError("本地读取到数据长度为0,Dir:"+Dir); return(null); } FileMap.InitFileMapInfo(bs); //Debug.LogError("初始化Map成功,len:"+bs.Length+"Dir:"+Dir); return(FileMap); }
private void PrepareDownloads(FileMapSystem.FileMapSystem newMap, string versionStr) { if (_downloader != null) { _downloader.Release(); _downloader = null; } _downloader = new HttpFileDownloader(new Uri(GetDownloadBaseURL(versionStr)), AssetBundlePathResolver.BundleSaveDirName); var currentMap = AssetBundleManager.Instance.GetFileMapSystem(); var misses = currentMap.GetMissFileMaps(newMap); _currentDownloadingGroupDesc = misses; CommonLog.Log(MAuthor.WY, $"{misses.Count} files miss in current file map"); foreach (var fileMapGroupDescIter in misses) { var fileName = fileMapGroupDescIter.Key; var desc = fileMapGroupDescIter.Value; var fileSavePath = _savePath + fileName; if (File.Exists(fileSavePath)) { var bytes = FileUtils.ReadAllBytes(fileSavePath); if (bytes != null && bytes.Length > 0) { var md5 = MD5Creater.Md5Struct(bytes); if (md5.MD51 == desc.Md51 && md5.MD52 == desc.Md52) { CommonLog.Log(MAuthor.WY, $"file {fileSavePath} already exist, skip"); continue; } } } _downloader.AddDownLoad(new WWWFileDownloader.DownloadFileInfo { FileName = fileName, FileSize = desc.Len, MapedFileName_MD51 = desc.Md51, MapedFileName_MD52 = desc.Md52, }); } }
/// <summary> /// 从本地StreamAsset初始化FileMap信息,会尝试合并Persist的补丁 /// </summary> public void InitFromLocalFile() { var isFromPersist = true; FileMapSystem PFM = null; try { PFM = CreateFromPersistAssetFile(Dir); //检查是否读取到了坏文件 if (PFM?.FileInfo == null || PFM.FileInfo.Ver.Version_Build == 0) { isFromPersist = false; } } catch (Exception e) { isFromPersist = false; CommonLog.Error(e); } if (isFromPersist) { InitFileMapInfo(PFM); } else { //不行就读取本地 var SFM = CreateFromStreamAssetFile(Dir); if (SFM == null) { CommonLog.Error("初始化AB系统配置表失败"); } else { InitFileMapInfo(SFM); } } }
/// <summary> /// 比较MD5确定是否一样 /// </summary> /// <returns></returns> public bool CheckSameContent(FileMapSystem sys) { return(FileInfo.MD51 == sys.FileInfo.MD51 && FileInfo.MD52 == sys.FileInfo.MD52); }
/// <summary> /// 返回大小,-1,0,1 /// </summary> /// <returns></returns> public int CompareVersion(FileMapSystem sys) { return(FileInfo.Ver.CompareVersion(sys.FileInfo.Ver)); }
public static FileMapSystemTagFindResultHelper FindInfos(FileMapSystem sys, int[] tags) { var res = new FileMapSystemTagFindResultHelper(); res.SearchTags = tags; var dictDowned = new Dictionary <string, int>(); var dictMiss = new Dictionary <string, int>(); foreach (var info in sys.FileInfo.AllFileMapInfo) { if (res.ContainsTag(info.FileTag)) { res.AllInfos.Add(info); var mappedName = info.GetMappedFileName(); UnityFileLoaderHelper.eFileLoaderPosType pos; if (UnityFileLoaderHelper.IsFileExist(sys.Dir, mappedName, out pos)) { if (!dictDowned.ContainsKey(mappedName)) { dictDowned[mappedName] = info.Len; } else { dictDowned[mappedName] = dictDowned[mappedName] + info.Len; } } else { if (!dictMiss.ContainsKey(mappedName)) { dictMiss[mappedName] = info.Len; } else { dictMiss[mappedName] = dictMiss[mappedName] + info.Len; } } } } foreach (var info in dictDowned) { var wd = new WWWFileDownloader.DownloadFileInfo() { FileName = info.Key, FileSize = info.Value }; res.Downloaded.Add(wd); res.DownloadedSize += info.Value; } foreach (var info in dictMiss) { var wd = new WWWFileDownloader.DownloadFileInfo() { FileName = info.Key, FileSize = info.Value }; res.Missed.Add(wd); res.MissedSize += info.Value; } return(res); }
private IEnumerator RequestVersions() { OnMessage("正在获取版本信息..."); if (Application.internetReachability == NetworkReachability.NotReachable) { var mb = MessageBox.Show("提示", "请检查网络连接状态", "重试", "退出"); yield return(mb); if (mb.isOk) { StartUpdate(); } else { Quit(); } yield break; } var versionFilePath = _tempDownloadPath + VersionInfoFileName; var singleFileDownloadRequest = new SingleFileDownloadRequest(); singleFileDownloadRequest.Reset(GetDownloadURL(VersionInfoFileName), versionFilePath); yield return(DownloadSingleFile(singleFileDownloadRequest)); if (!singleFileDownloadRequest.success) { yield break; } VersionInfo versionInfo; try { var versionFileStr = File.ReadAllText(versionFilePath); versionInfo = versionFileStr.FromXML <VersionInfo>(); } catch (Exception e) { CommonLog.Error(e.Message); MessageBox.Show("提示", "版本文件加载失败", "重试", "退出").onComplete += delegate(MessageBox.EventId id) { if (id == MessageBox.EventId.Ok) { StartUpdate(); } else { Quit(); } }; yield break; } var state = versionInfo.CheckUpdateState(AssetBundleManager.Instance.GetVersion()); _currentTargetVersion = versionInfo; var versionStr = versionInfo.DumpVersion(); CommonLog.Log(MAuthor.WY, $"check version {versionStr} result {state}"); if (state == VersionInfo.State.NeedUpdate) { //下载xmf var xmfFileName = AssetBundlePathResolver.BundleSaveDirName + FileMapGroupInfo.FileExtension; var xmfTargetPath = _tempDownloadPath + xmfFileName; singleFileDownloadRequest.Reset(GetDownloadURL(xmfFileName, versionStr), xmfTargetPath, new MD5Creater.MD5Struct { MD51 = versionInfo.AssetBundlesCacheXmfMd51, MD52 = versionInfo.AssetBundlesCacheXmfMd52 }); yield return(DownloadSingleFile(singleFileDownloadRequest)); if (!singleFileDownloadRequest.success) { yield break; } //下载AssetBundleXMLData.xml var xmlPath = _tempDownloadPath + AssetBundlePathResolver.DependFileName; singleFileDownloadRequest.Reset( GetDownloadURL(AssetBundlePathResolver.DependFileName, versionStr), xmlPath, new MD5Creater.MD5Struct { MD51 = versionInfo.AssetBundleXmlMd51, MD52 = versionInfo.AssetBundleXmlMd52 }); yield return(DownloadSingleFile(singleFileDownloadRequest)); if (!singleFileDownloadRequest.success) { yield break; } var tableStr = File.ReadAllText(xmlPath); _currentDownloadAssetBundleTable = tableStr.FromXML <AssetBundleTable>(); var newFileMap = new FileMapSystem.FileMapSystem(_tempDownloadPath); var bs = File.ReadAllBytes(xmfTargetPath); newFileMap.InitFileMapInfo(bs); PrepareDownloads(newFileMap, versionStr); _step = Step.Prepared; } else { switch (state) { case VersionInfo.State.MustDownloadAppAgain: { #if UNITY_ANDROID ShowAndroidUpdateDialog(versionInfo.AppUpdateUrl); yield break; #elif UNITY_IOS ShowIOSUpdateDialog(versionInfo.AppUpdateUrl); yield break; #else var mb = MessageBox.Show("提示", $"需要重新下载app"); yield return(mb); Quit(); #endif break; } case VersionInfo.State.NotNeedUpdate: { OnComplete(); break; } } } }