예제 #1
0
        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();
        }
예제 #2
0
        /// <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);
                }
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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));
        }
예제 #5
0
        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);
        }
예제 #6
0
        public void Save(string path, UpdateFile updateFile)
        {
            IFile file = Disk.File(path + Path.AltDirectorySeparatorChar + UpdateFileStore.FILE_NAME);

            file.Delete();
            file.Create(updateFile.Data.ToByte());
        }
예제 #7
0
        /// <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();
        }
예제 #8
0
        /// <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();
        }
예제 #9
0
        /// <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);
        }
예제 #10
0
        /// <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);
        }
예제 #11
0
        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);
        }