protected IEnumerator DeleteOldAsset(UpdateFile needDeleteLst) { App.Trigger(this).SetEventName(AutoUpdateEvents.ON_DELETE_DISK_OLD_FILE_START) .SetEventLevel(EventLevel.Global) .Trigger(); IFile file; foreach (UpdateFileField field in needDeleteLst) { file = Disk.File(Env.AssetPath + field.Path, PathTypes.Absolute); if (file.Exists) { App.Trigger(this).SetEventName(AutoUpdateEvents.ON_DELETE_DISK_OLD_FIELD_ACTION) .SetEventLevel(EventLevel.Global) .Trigger(); file.Delete(); } } yield return(null); App.Trigger(this).SetEventName(AutoUpdateEvents.ON_DELETE_DISK_OLD_FILE_END) .SetEventLevel(EventLevel.Global) .Trigger(); }
/// <summary> /// 和新的列表比对,筛选出需要更新的内容和需要删除的内容 /// </summary> /// <param name="newLst"></param> /// <returns></returns> public void Comparison(UpdateFile newLst, out UpdateFile needUpdate, out UpdateFile needDelete) { needUpdate = new UpdateFile(); needDelete = new UpdateFile(); UpdateFileField oldField; foreach (UpdateFileField newField in newLst) { oldField = Find(newField.Path); if (oldField != null) { if (oldField.MD5 != newField.MD5) { needUpdate.Append(newField); } } else { needUpdate.Append(newField); } } foreach (UpdateFileField old in this) { if (newLst.Find(old.Path) == null && old.Path != Path.AltDirectorySeparatorChar + UpdateFileStore.FILE_NAME) { needDelete.Append(old); } } }
/// <summary> /// 从字节流加载更新文件 /// </summary> /// <param name="bytes">字节流</param> /// <returns>更新文件数据</returns> public UpdateFile LoadFromBytes(byte[] bytes) { var file = new UpdateFile(); file.Parse(new UTF8Encoding(false).GetString(bytes)); return(file); }
/// <summary> /// 保存一个更新文件 /// </summary> /// <param name="path">存储路径(绝对路径)</param> /// <param name="updateFile">更新文件数据</param> public void Save(string path, UpdateFile updateFile) { var file = Disk.File(path + Path.AltDirectorySeparatorChar + FILE_NAME, PathTypes.Absolute); file.Delete(); file.Create(Encoding.UTF8.GetBytes(updateFile.Data)); }
protected IEnumerator UpdateAssetFromUrl(UpdateFile needUpdateLst, string downloadUrl) { updateNum = 0; needUpdateNum = needUpdateLst.Count; string savePath, downloadPath, saveDir; base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_FILE_START); foreach (UpdateFileField field in needUpdateLst) { downloadPath = downloadUrl + field.Path; savePath = Env.AssetPath + field.Path; saveDir = savePath.Substring(0, savePath.LastIndexOf(Path.AltDirectorySeparatorChar)); updateNum++; base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_FILE_ACTION); using (UnityWebRequest request = UnityWebRequest.Get(downloadPath)) { yield return(request.Send()); if (request.isError || request.responseCode != 200) { base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_FILE_FAILD); yield break; } Disk.Directory(saveDir, PathTypes.Absolute).Create(); IFile saveFile = Disk.File(savePath, PathTypes.Absolute); saveFile.Create(request.downloadHandler.data); } } base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_FILE_END); }
public void Save(string path, UpdateFile updateFile) { IFile file = Disk.File(path + Path.AltDirectorySeparatorChar + UpdateFileStore.FILE_NAME); file.Delete(); file.Create(updateFile.Data.ToByte()); }
/// <summary> /// 获取文件更新列表 /// </summary> /// <param name="resUrl">更新url</param> /// <returns>迭代器</returns> private IEnumerator UpdateList(string resUrl) { App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_START, this) .SetEventLevel(EventLevel.Global) .Trigger(); resUrl = resUrl + Path.AltDirectorySeparatorChar + Env.PlatformToName(Env.SwitchPlatform); var request = UnityWebRequest.Get(resUrl + Path.AltDirectorySeparatorChar + UpdateFileStore.FILE_NAME); yield return(request.Send()); if (request.isError || request.responseCode != 200) { isUpdate = false; App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_LIST_FAILED, this) .SetEventLevel(EventLevel.Global) .Trigger(); yield break; } App.TriggerGlobal(AutoUpdateEvents.ON_SCANNING_DISK_FILE_HASH_START, this) .SetEventLevel(EventLevel.Global) .Trigger(); var fileStore = App.Make <UpdateFileStore>(); var newLst = fileStore.LoadFromBytes(request.downloadHandler.data); var oldLst = new UpdateFile(); //fileStore.LoadFromPath(Env.AssetPath); Disk.Root.Create(); Disk.Root.Walk((file) => { if (Util.StandardPath(file.FullName).EndsWith(".meta")) { return; } var fullName = Util.StandardPath(file.FullName); var assetName = fullName.Substring(Env.AssetPath.Length); oldLst.Append(assetName, Hash.FileMd5(file.FullName), file.Length); }); App.TriggerGlobal(AutoUpdateEvents.ON_SCANNING_DISK_FILE_HASH_END, this) .SetEventLevel(EventLevel.Global) .Trigger(); UpdateFile needUpdateLst, needDeleteLst; oldLst.Comparison(newLst, out needUpdateLst, out needDeleteLst); yield return(DeleteOldAsset(needDeleteLst)); yield return(UpdateAssetFromUrl(needUpdateLst, resUrl)); fileStore.Save(Env.AssetPath, newLst); App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_COMPLETE, this) .SetEventLevel(EventLevel.Global) .Trigger(); }
/// <summary> /// 通过url更新资源 /// </summary> /// <param name="needUpdateLst">需要更新的列表</param> /// <param name="downloadUrl">下载列表</param> /// <returns>迭代器</returns> private IEnumerator UpdateAssetFromUrl(UpdateFile needUpdateLst, string downloadUrl) { string savePath, downloadPath, saveDir; var i = 0; var updatePath = new string[needUpdateLst.Count]; foreach (UpdateFileField field in needUpdateLst) { updatePath[i++] = field.Path; } App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_FILE_START, this) .SetEventLevel(EventLevel.Global) .Trigger(new UpdateFileStartEventArgs(updatePath)); for (i = 0; i < updatePath.Length; i++) { downloadPath = downloadUrl + Path.AltDirectorySeparatorChar + updatePath[i]; savePath = Env.AssetPath + Path.AltDirectorySeparatorChar + updatePath[i]; saveDir = savePath.Substring(0, savePath.LastIndexOf(Path.AltDirectorySeparatorChar)); using (var request = UnityWebRequest.Get(downloadPath)) { App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_FILE_ACTION, this) .SetEventLevel(EventLevel.Global) .Trigger(new UpdateFileActionEventArgs(updatePath[i], request)); yield return(request.Send()); if (request.isError || request.responseCode != 200) { App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_FILE_FAILD, this) .SetEventLevel(EventLevel.Global) .Trigger(); yield break; } Disk.Directory(saveDir, PathTypes.Absolute).Create(); var saveFile = Disk.File(savePath, PathTypes.Absolute); saveFile.Create(request.downloadHandler.data); } } App.TriggerGlobal(AutoUpdateEvents.ON_UPDATE_FILE_END, this) .SetEventLevel(EventLevel.Global) .Trigger(); }
/// <summary> /// 编译列表文件 /// </summary> /// <param name="path">路径</param> protected void BuildListFile(IBuildContext context) { UpdateFile lst = new UpdateFile(); IFile file; for (int i = 0; i < context.ReleaseFiles.Length; i++) { file = context.Disk.File(context.ReleasePath + Path.AltDirectorySeparatorChar + context.ReleaseFiles[i], PathTypes.Absolute); lst.Append(context.ReleaseFiles[i], MD5.ParseFile(file.FullName), file.Length); } var store = App.Instance.Make(typeof(UpdateFileStore).ToString()) as UpdateFileStore; store.Save(context.ReleasePath, lst); }
/// <summary> /// 获取文件更新列表 /// </summary> /// <returns></returns> protected IEnumerator UpdateList(string resUrl) { base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_START); resUrl = resUrl + Path.AltDirectorySeparatorChar + Env.PlatformToName(Env.SwitchPlatform); UnityWebRequest request = UnityWebRequest.Get(resUrl + Path.AltDirectorySeparatorChar + UpdateFileStore.FILE_NAME); yield return(request.Send()); if (request.isError || request.responseCode != 200) { this.isUpdate = false; base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_LIST_FAILED); yield break; } base.Event.Trigger(AutoUpdateEvents.ON_SCANNING_DISK_FILE_HASH_START); var fileStore = new UpdateFileStore(); var newLst = fileStore.LoadFromBytes(request.downloadHandler.data); var oldLst = new UpdateFile(); //fileStore.LoadFromPath(Env.AssetPath); Disk.Root.Create(); Disk.Root.Walk((file) => { if (!file.FullName.Standard().EndsWith(".meta")) { string fullName = file.FullName.Standard(); string assetName = fullName.Substring(Env.AssetPath.Length); oldLst.Append(assetName, Hash.FileHash(file.FullName), file.Length); } }); base.Event.Trigger(AutoUpdateEvents.ON_SCANNING_DISK_FILE_HASH_END); UpdateFile needUpdateLst, needDeleteLst; oldLst.Comparison(newLst, out needUpdateLst, out needDeleteLst); yield return(this.DeleteOldAsset(needDeleteLst)); yield return(this.UpdateAssetFromUrl(needUpdateLst, resUrl)); fileStore.Save(Env.AssetPath, newLst); base.Event.Trigger(AutoUpdateEvents.ON_UPDATE_COMPLETE); }
protected IEnumerator DeleteOldAsset(UpdateFile needDeleteLst) { base.Event.Trigger(AutoUpdateEvents.ON_DELETE_DISK_OLD_FILE_START); IFile file; foreach (UpdateFileField field in needDeleteLst) { file = Disk.File(Env.AssetPath + field.Path, PathTypes.Absolute); if (file.Exists) { base.Event.Trigger(AutoUpdateEvents.ON_DELETE_DISK_OLD_FIELD_ACTION); file.Delete(); } } yield return(null); base.Event.Trigger(AutoUpdateEvents.ON_DELETE_DISK_OLD_FILE_END); }