Exemple #1
0
 public void InitFileMapInfo(FileMapSystem sys)
 {
     if (sys == null)
     {
         return;
     }
     Dir = sys.Dir;
     _FileMapInfoFileName = sys.FileMapInfoFileName;
     FileInfo             = sys.FileInfo;
     RecalFileInfo2NameMap();
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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,
                });
            }
        }
Exemple #6
0
        /// <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);
                }
            }
        }
Exemple #7
0
 /// <summary>
 /// 比较MD5确定是否一样
 /// </summary>
 /// <returns></returns>
 public bool CheckSameContent(FileMapSystem sys)
 {
     return(FileInfo.MD51 == sys.FileInfo.MD51 && FileInfo.MD52 == sys.FileInfo.MD52);
 }
Exemple #8
0
 /// <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);
        }
Exemple #10
0
        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;
                }
                }
            }
        }