public static void UnpackToUserdata(string TargetGameFolder, string zip, Dictionary <string, string> roleInfo, TextBox logPanel) { using (FileStream fs = new FileStream(zip, FileMode.Open)) using (ZipArchive zipArchive = new ZipArchive(fs, ZipArchiveMode.Read)) { try { zipArchive.GetEntry("profile.json").ExtractToFile("profile.json"); Profile profile = JsonSerializer.Deserialize <Profile>(File.ReadAllText("profile.json")); File.Delete("profile.json"); if (profile.version != MainWindow.VERSION) { Log("WARN: The description document version of the data is inconsistent with the program version. This may cause data migration errors.", logPanel); } Dictionary <string, string[]> files = profile.files; //释放userdata的文件 if (files.ContainsKey("userdata")) { string userdataFolder = TargetGameFolder + $@"\userdata\{roleInfo["account"]}\{roleInfo["area"]}\{roleInfo["server"]}\{roleInfo["role"]}\"; foreach (string f in Directory.GetFileSystemEntries(userdataFolder)) { if (File.Exists(f)) { File.Delete(f); } } foreach (string file in files["userdata"]) { try { ZipArchiveEntry zipArchiveEntry = zipArchive.GetEntry(file); zipArchiveEntry.ExtractToFile(userdataFolder + Path.GetFileName(file), true); Helper.Log($"INFO: File \"{file}\" has been extract to \"{userdataFolder + Path.GetFileName(file)}\"", logPanel); } catch (Exception E) { Helper.Log(E.Message, logPanel); Helper.Log(E.StackTrace, logPanel); } } } //释放剑心插件集的全局文件 if (files.ContainsKey("jx_config")) { foreach (string file in files["jx_config"]) { try { ZipArchiveEntry zipArchiveEntry = zipArchive.GetEntry(file); string targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file); Directory.CreateDirectory(targetExtractFolder); zipArchiveEntry.ExtractToFile(TargetGameFolder + file, true); Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file}\"", logPanel); } catch (Exception E) { Helper.Log(E.Message, logPanel); Helper.Log(E.StackTrace, logPanel); } } } //释放茗伊插件集的全局文件 if (files.ContainsKey("my_config")) { foreach (string file in files["my_config"]) { try { ZipArchiveEntry zipArchiveEntry = zipArchive.GetEntry(file); string targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file); Directory.CreateDirectory(targetExtractFolder); zipArchiveEntry.ExtractToFile(TargetGameFolder + file, true); Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file}\"", logPanel); } catch (Exception E) { Helper.Log(E.Message, logPanel); Helper.Log(E.StackTrace, logPanel); } } } string roleId = GetGlobalIdByIdAndServer(roleInfo["role"], roleInfo["server"], TargetGameFolder); if (roleId == null) { Console.WriteLine("Cannot find out role id in MY#DATA, All role plugin setting will be skip."); } if (files.ContainsKey("jx_role_config") && roleId != null) { foreach (string file in files["jx_role_config"]) { try { string file_name = file.Replace("roleId", $"{roleId}"); ZipArchiveEntry zipArchiveEntry = zipArchive.GetEntry(file); string targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file_name); Directory.CreateDirectory(targetExtractFolder); zipArchiveEntry.ExtractToFile(TargetGameFolder + file_name, true); Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file_name}\"", logPanel); } catch (Exception E) { Helper.Log(E.Message, logPanel); Helper.Log(E.StackTrace, logPanel); } } } if (files.ContainsKey("my_role_config") && roleId != null) { foreach (string file in files["my_role_config"]) { try { string file_name = file.Replace("roleId", $"{roleId}@zhcn_hd"); ZipArchiveEntry zipArchiveEntry = zipArchive.GetEntry(file); string targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file_name); Directory.CreateDirectory(targetExtractFolder); zipArchiveEntry.ExtractToFile(TargetGameFolder + file_name, true); Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file_name}\"", logPanel); } catch (Exception E) { Helper.Log(E.Message, logPanel); Helper.Log(E.StackTrace, logPanel); } } } } catch (Exception e) { throw e; } } File.Delete(zip); }
public static void GetZipFromUserdata(string SourceData, string zip, Dictionary <string, string> roleInfo, Dictionary <string, bool> contain_options, TextBox logPanel) { Profile profile = new Profile { version = MainWindow.VERSION }; Dictionary <string, string[]> allFiles = new Dictionary <string, string[]>(); try { using (FileStream fs = new FileStream(zip, FileMode.Create)) using (ZipArchive zipArchive = new ZipArchive(fs, ZipArchiveMode.Create)) { //userdata设置迁移,最基本的数据文件 if (contain_options["userdata"]) { ArrayList files = new ArrayList(); string[] file_list = { "addon.jx3dat", "CoinShopOutfitData.jx3dat", "custom.dat", "custom.dat.addon", "userpreferences.jx3dat", "hotkey.data", "hotkey_last.txt", "hotkey_back0.txt", "hotkey_back1.txt", "hotkey_back2.txt", "hotkey_back3.txt", "hotkey_back4.txt", }; string userdataFolder = SourceData + $@"\userdata\{roleInfo["account"]}\{roleInfo["area"]}\{roleInfo["server"]}\{roleInfo["role"]}\"; foreach (string file in file_list) { try { string file_name = @"\userdata\" + file; zipArchive.CreateEntryFromFile(userdataFolder + file, file_name); files.Add(file_name); } catch (Exception E) { Log($"Take \"{userdataFolder}{file}\" into Zip File Error!", logPanel); Log(E.Message, logPanel); Log(E.StackTrace, logPanel); } } if (contain_options["userdata_async"]) { try { string file_name = @"\userdata\userpreferencesasync.jx3dat"; Uri uri = new Uri(@"pack://*****:*****@"\userdata\userpreferencesasync.jx3dat"; zipArchive.CreateEntryFromFile("userpreferencesasync.jx3dat", file_name); File.Delete("userpreferencesasync.jx3dat"); } catch (Exception E) { Log("Take \"userpreferencesasync.jx3dat\" into Zip File Error!", logPanel); Log(E.Message, logPanel); Log(E.StackTrace, logPanel); } } else { try { string file_name = @"\userdata\userpreferencesasync.jx3dat"; zipArchive.CreateEntryFromFile(userdataFolder + "userpreferencesasync.jx3dat", file_name); files.Add(file_name); } catch (Exception E) { Log($"Take {userdataFolder}\"userpreferencesasync.jx3dat\" into Zip File Error!", logPanel); Log(E.Message, logPanel); Log(E.StackTrace, logPanel); } } allFiles.Add("userdata", (string[])files.ToArray(typeof(string))); } //看能不能找到需要迁移角色的globalId,因为剑心 茗伊这些插件储存的时候都是用globalId存储的 //只通过文件的话只能找到茗伊插件数据里面对应id的文件夹来获取globalId //如果找不到的话就没办法进性插件相关的设置2迁移了 string roleId = GetGlobalIdByIdAndServer(roleInfo["role"], roleInfo["server"], SourceData); if (roleId == null) { Console.WriteLine("Cannot find out role id in MY#DATA, All role plugin setting will be skip."); } //剑心插件集的一些角色设置,喊话,技能释放什么的 if (contain_options["jx_role_config"] && roleId != null) { ArrayList files = new ArrayList(); string[] file_list = { $@"\interface\JX#DATA\killnotice\{roleId}.jx3dat", //技能喊话 $@"\interface\JX#DATA\othernotice\{roleId}.jx3dat", //入组 入帮之类的喊话 $@"\interface\JX#DATA\skillnotice\{roleId}.jx3dat" //击杀提示 }; foreach (string file in file_list) { try { string file_name = file.Replace($"{roleId}", "roleId"); zipArchive.CreateEntryFromFile(SourceData + file, file_name); files.Add(file_name); } catch (Exception e) { Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!"); Console.WriteLine(e.StackTrace); } } allFiles.Add("jx_role_config", (string[])files.ToArray(typeof(string))); } //茗伊插件集的角色设置 if (contain_options["my_role_config"] && roleId != null) { ArrayList files = new ArrayList(); string[] file_list = { $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\anmerkungen.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\focus.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\infotip.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\memo.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\my_targetmon.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\settings.db", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\storageversion.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\tutorialed.jx3dat", $@"\interface\MY#DATA\{roleId}@zhcn_hd\manifest.jx3dat" }; foreach (string file in file_list) { try { string file_name = file.Replace($"{roleId}@zhcn_hd", "roleId"); zipArchive.CreateEntryFromFile(SourceData + file, file_name); files.Add(file_name); } catch (Exception e) { Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!"); Console.WriteLine(e.StackTrace); } } allFiles.Add("my_role_config", (string[])files.ToArray(typeof(string))); } //剑心插件集的全局设置 if (contain_options["jx_config"]) { ArrayList files = new ArrayList(); string[] file_list = { $@"\interface\JX#DATA\hiderepresent\HideActionData.jx3dat", $@"\interface\JX#DATA\skillcastmode\CastModeData.jx3dat", $@"\interface\JX#DATA\targetlist\CustomMod.jx3dat", $@"\interface\JX#DATA\targetlist\FocusTarget.jx3dat", $@"\interface\JX#DATA\CustomData.jx3dat", }; foreach (string file in file_list) { try { zipArchive.CreateEntryFromFile(SourceData + file, file); files.Add(file); } catch (Exception e) { Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!"); Console.WriteLine(e.StackTrace); } } allFiles.Add("jx_config", (string[])files.ToArray(typeof(string))); } //茗伊插件集的全局设置 if (contain_options["my_config"]) { ArrayList files = new ArrayList(); string[] file_list = { @"\interface\MY#DATA\!all-users@zhcn_hd\config\settings.db", @"\interface\MY#DATA\!all-users@zhcn_hd\config\yy.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\show_notify.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\serendipity_autoshare.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\screenshot.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\my_targetmon.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\memo.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\fontconfig.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\chatmonitor.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\chatblockwords.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\cataclysm\common.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\focus\common.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\config\xlifebar\common.jx3dat", @"\interface\MY#DATA\!all-users@zhcn_hd\manifest.jx3dat" }; if (Directory.Exists(SourceData + @"\interface\MY#DATA\!all-users@zhcn_hd\userdata\TargetMon")) { string[] TargetMonFiles = Directory.GetFiles(SourceData + @"\interface\MY#DATA\!all-users@zhcn_hd\userdata\TargetMon"); foreach (string TargetMonFile in TargetMonFiles) { string file_name = $@"\interface\MY#DATA\!all-users@zhcn_hd\userdata\TargetMon\{Path.GetFileName(TargetMonFile)}"; try { zipArchive.CreateEntryFromFile(SourceData + file_name, file_name); files.Add(file_name); } catch (Exception e) { Console.WriteLine($"Take \"{SourceData}{file_name}\" into Zip File Error!"); Console.WriteLine(e.StackTrace); } } } foreach (string file in file_list) { try { zipArchive.CreateEntryFromFile(SourceData + file, file); files.Add(file); } catch (Exception e) { Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!"); Console.WriteLine(e.StackTrace); } } allFiles.Add("my_config", (string[])files.ToArray(typeof(string))); } string[] contains = allFiles.Keys.ToArray <string>(); profile.contains = contains; profile.files = allFiles; try { File.WriteAllText("profile.json", JsonSerializer.Serialize(profile)); zipArchive.CreateEntryFromFile("profile.json", "profile.json"); File.Delete("profile.json"); } catch (Exception e) { Log($"Delete Temp File \"profile.json\" File Error!", logPanel); Log(e.Message, logPanel); Log(e.StackTrace, logPanel); } } } catch (Exception e) { throw e; } }