public async Task <List <Resources.ResourceInfo> > UnPackAssets(string packageAbsFile, string targetAbsPath) { List <Resources.ResourceInfo> retList = new List <Resources.ResourceInfo>(20); EditorCommon.FileSystemWatcherProcess.Enable = false; targetAbsPath = targetAbsPath.Replace("\\", "/").TrimEnd('/') + "/"; mNameManager.ClearMapper(); EngineNS.CEngine.Instance.FileManager.ClearPackageRNameCache(); // unzip var tempPath = EngineNS.CEngine.Instance.FileManager.Root + Guid.NewGuid().ToString() + "/"; if (EngineNS.CEngine.Instance.FileManager.DirectoryExists(tempPath)) { EngineNS.CEngine.Instance.FileManager.DeleteDirectory(tempPath, true); } EngineNS.CEngine.Instance.FileManager.CreateDirectory(tempPath); System.IO.File.SetAttributes(tempPath, System.IO.FileAttributes.Hidden); System.IO.Compression.ZipFile.ExtractToDirectory(packageAbsFile, tempPath); var srcContentTempPath = (tempPath + "Content/").Replace("\\", "/").ToLower(); var srcEditorContentTempPath = (tempPath + "EditContent/").Replace("\\", "/").ToLower(); var srcEngineContentTempPath = (tempPath + "EngineContent/").Replace("\\", "/").ToLower(); MessageBox.enMessageBoxResult chooseResult = MessageBox.enMessageBoxResult.Cancel; // EditorContent和EngineContent的对象直接复制 if (EngineNS.CEngine.Instance.FileManager.DirectoryExists(srcEditorContentTempPath)) { var files = EngineNS.CEngine.Instance.FileManager.GetFiles(srcEditorContentTempPath, "*", System.IO.SearchOption.AllDirectories); for (int i = 0; i < files.Count; i++) { var file = files[0].Replace("\\", "/").ToLower(); var tagFile = file.Replace(srcEditorContentTempPath, EngineNS.CEngine.Instance.FileManager.EditorContent); switch (chooseResult) { case MessageBox.enMessageBoxResult.YesAll: EngineNS.CEngine.Instance.FileManager.CopyFile(file, tagFile, true); break; case MessageBox.enMessageBoxResult.NoAll: EngineNS.CEngine.Instance.FileManager.CopyFile(file, tagFile, false); break; default: if (EngineNS.CEngine.Instance.FileManager.FileExists(tagFile)) { chooseResult = EditorCommon.MessageBox.Show($"文件{tagFile}与包中文件重名,是否覆盖?", MessageBox.enMessageBoxButton.Yes_YesAll_No_NoAll); switch (chooseResult) { case MessageBox.enMessageBoxResult.Yes: EngineNS.CEngine.Instance.FileManager.CopyFile(file, tagFile, true); break; } } break; } } } if (EngineNS.CEngine.Instance.FileManager.DirectoryExists(srcEngineContentTempPath)) { var files = EngineNS.CEngine.Instance.FileManager.GetFiles(srcEngineContentTempPath, "*", System.IO.SearchOption.AllDirectories); for (int i = 0; i < files.Count; i++) { var file = files[0].Replace("\\", "/").ToLower(); var tagFile = file.Replace(srcEngineContentTempPath, EngineNS.CEngine.Instance.FileManager.EngineContent); switch (chooseResult) { case MessageBox.enMessageBoxResult.YesAll: EngineNS.CEngine.Instance.FileManager.CopyFile(file, tagFile, true); break; case MessageBox.enMessageBoxResult.NoAll: if (!EngineNS.CEngine.Instance.FileManager.FileExists(tagFile)) { EngineNS.CEngine.Instance.FileManager.CopyFile(file, tagFile, false); } break; default: if (EngineNS.CEngine.Instance.FileManager.FileExists(tagFile)) { chooseResult = EditorCommon.MessageBox.Show($"文件{tagFile}与包中文件重名,是否覆盖?", MessageBox.enMessageBoxButton.Yes_YesAll_No_NoAll); switch (chooseResult) { case MessageBox.enMessageBoxResult.Yes: EngineNS.CEngine.Instance.FileManager.CopyFile(file, tagFile, true); break; } } break; } } } // Content中放入目标目录 if (EngineNS.CEngine.Instance.FileManager.DirectoryExists(srcContentTempPath)) { // 读取RName表 var xmlHolder = EngineNS.IO.XmlHolder.LoadXML(tempPath + "RNames.xml"); var rNameDataNode = xmlHolder.RootNode.FindNode("RNameData"); Dictionary <int, RNameData> rNameDataDic = new Dictionary <int, RNameData>(); Dictionary <string, RNameData> rNameDataPathDic = new Dictionary <string, RNameData>(); if (rNameDataNode != null) { var cNodes = rNameDataNode.GetNodes(); foreach (var cNode in cNodes) { var data = new RNameData(); var idxAtt = cNode.FindAttrib("Index"); if (idxAtt != null) { data.Index = System.Convert.ToInt32(idxAtt.Value); } var nameAtt = cNode.FindAttrib("Name"); if (nameAtt != null) { data.Name = nameAtt.Value; } var rtAtt = cNode.FindAttrib("RNameType"); if (rtAtt != null) { data.RNameType = EngineNS.Rtti.RttiHelper.EnumTryParse <EngineNS.RName.enRNameType>(rtAtt.Value); } var pathAtt = cNode.FindAttrib("PackagePath"); if (pathAtt != null) { data.PackagePath = pathAtt.Value; } rNameDataDic.Add(data.Index, data); rNameDataPathDic.Add(data.PackagePath, data); } } // RName填充,将RName中路径填充为Package目录 var rNameDataDicEnum = rNameDataDic.GetEnumerator(); while (rNameDataDicEnum.MoveNext()) { var rName = EngineNS.RName.GetRName(rNameDataDicEnum.Current.Key); rName.RNameType = EngineNS.RName.enRNameType.Package; rName.Name = tempPath + EngineNS.RName.GetRootFolderName(rNameDataDicEnum.Current.Value.RNameType) + rNameDataDicEnum.Current.Value.PackagePath; } // Shader目录直接拷贝 if (EngineNS.CEngine.Instance.FileManager.DirectoryExists(srcContentTempPath + "shaders")) { EngineNS.CEngine.Instance.FileManager.CopyDirectory(srcContentTempPath + "shaders", EngineNS.CEngine.Instance.FileManager.ProjectContent + "shaders"); } var relPath = EngineNS.CEngine.Instance.FileManager._GetRelativePathFromAbsPath(targetAbsPath, EngineNS.CEngine.Instance.FileManager.ProjectContent); // 全部加载, var files = EngineNS.CEngine.Instance.FileManager.GetFiles(srcContentTempPath, "*.rinfo", System.IO.SearchOption.AllDirectories); List <PackageResData> mLoadedResInfoDatas = new List <PackageResData>(files.Count); for (int i = 0; i < files.Count; i++) { var file = files[i].Replace("\\", "/"); var resInfo = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(file, null); var rnm = mNameManager.GetRNameIndex(resInfo.ResourceName); if (rnm == null) { continue; } var loadData = new EditorCommon.Assets.AssetsPakage.LoadResourceData() { ObjType = null, RNameMapper = rnm, }; await resInfo.AssetsOption_LoadResource(loadData); var pkResData = new PackageResData() { ResInfo = resInfo, RNM = rnm, }; mLoadedResInfoDatas.Add(pkResData); } // 填充rname,将RName中路径填充为Content目录,这里需要保证在之前全部加载完成,否则可能导致加载到目标目录的文件,而目标目录的文件是有可能还没导入 foreach (var cache in EngineNS.CEngine.Instance.FileManager.PackageRNameCache.Values) { RNameData data; if (rNameDataDic.TryGetValue(cache.NameIndexInPakage, out data)) { cache.RNameType = data.RNameType; if (cache.RNameType == EngineNS.RName.enRNameType.Game) { cache.Name = relPath + data.Name; } else { cache.Name = data.Name; } } } // 全部存入目标文件夹 foreach (var resInfoData in mLoadedResInfoDatas) { var resInfo = resInfoData.ResInfo; var tempTagPath = resInfo.ResourceName.Address.Replace(srcContentTempPath, ""); string tagFile = targetAbsPath + tempTagPath; RNameData tempData; if (rNameDataPathDic.TryGetValue(tempTagPath, out tempData)) { tagFile = targetAbsPath + tempData.Name; } EngineNS.CEngine.Instance.FileManager.MergePackageRNameCacheToRNameManager(); var saveData = new SaveResourceData() { TargetAbsFileName = tagFile, ResObject = resInfoData.RNM.ResObject, SrcAbsFileName = resInfo.ResourceName.Address, }; await resInfo.AssetsOption_SaveResource(saveData); var tempResInfo = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(tagFile + EditorCommon.Program.ResourceInfoExt, null); await EngineNS.CEngine.Instance.GameEditorInstance.RefreshResourceInfoReferenceDictionary(tempResInfo); retList.Add(tempResInfo); } } EngineNS.CEngine.Instance.FileManager.DeleteDirectory(tempPath, true); //EditorCommon.MessageBox.Show("导入完成"); EditorCommon.FileSystemWatcherProcess.Enable = true; return(retList); }
private void Button_No_Click(object sender, RoutedEventArgs e) { Result = MessageBox.enMessageBoxResult.No; CloseWindow(); }