private void Replayer_Path_Click(object sender, RoutedEventArgs e) { string[] paths = null; System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog(); openFileDialog.Filter = "*.lcl|*.lcl"; if (openFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)//注意,此处一定要手动引入System.Window.Forms空间,否则你如果使用默认的DialogResult会发现没有OK属性 { MessageBox.Show("Wrong Path!"); } else { var p = openFileDialog.FileName; var pf = p.Remove(p.LastIndexOf('\\')) + "\\"; var name = openFileDialog.SafeFileName; name = name.Remove(name.LastIndexOf('_')); Replayer_Replay_Params_Manager = new ParaJSON(pf + name + "_rPara.json"); paths = System.IO.Directory.GetFiles(pf, name + "*.lcl"); paths = paths.OrderBy(x => { var i = x.LastIndexOf("_") + 1; var j = x.Length - ".lcl".Length; var s = x.Substring(i, j - i); return(int.Parse(s)); }).ToArray(); Replayer_Path.Content = "Path to File_0.LCL: " + pf; _replayer = new Core.ReplayCore(paths); var info = _replayer.FileInfo; // try to load params if (!Load_Replay_Params(info)) { // open a new file Replayer_Map.Items.Clear(); foreach (var point in info.points) { Replayer_Map.Items.Add(new Replayer_Map_Item(Replayer_Map.Items.Count, point)); } } Replayer_Speed.SelectedItem = "1x"; Replayer_Notes.Text = info.notes; Replayer_Slider.Maximum = info.totalIndex; } }
static void LoadPara(string[] args) { if (args.Length % 2 != 0) { Logger.Error.WriteLine("Para Input Error!"); return; } Dictionary <string, string> para = new Dictionary <string, string>(); for (int i = 0; i < args.Length; i += 2) { para.Add(args[i], args[i + 1]); } // 不指定参数则尝试加载默认配置 if (para.Count == 0) { para.Add("-t", "para.txt"); } // 从配置文件中加载参数 if (para.ContainsKey("-t")) { if (File.Exists(para["-t"])) { var str = File.ReadAllText(para["-t"]); List <string> buff = new List <string>(); args = File.ReadAllText(para["-t"]).Split(" "); for (int i = 0; i < args.Length; i++) { // "\"" 内可能有" " // 需要将其合并 if (args[i].Contains("\"")) { for (int j = i + 1; j < args.Length; j++) { args[i] += " " + args[j]; if (args[j].Contains("\"")) { buff.Add(args[i].Trim('\"')); i = j; break; } } } else { buff.Add(args[i]); } } args = buff.ToArray(); for (int i = 0; i < args.Length; i += 2) { para.Add(args[i], args[i + 1]); } } else { Logger.Error.WriteLine("No Such ParaFile!"); return; } } string[] paths = null; // 加载单一文件 if (para.ContainsKey("-f")) { if (File.Exists(para["-f"]) && para["-f"].EndsWith(".lcl")) { paths = new string[] { para["-f"] }; } else { Logger.Error.WriteLine("No Such File!"); return; } } // 加载文件夹 else if (para.ContainsKey("-p")) { if (Directory.Exists(para["-p"])) { paths = Directory.GetFiles(para["-p"], "*.lcl"); } else { Logger.Error.WriteLine("No Such Path!"); return; } } else { Logger.Error.WriteLine("No File Path!"); return; } // 加载映射关系 var map = new Dictionary <IPEndPoint, IPEndPoint>(); if (para.ContainsKey("-m")) { var ppp = para["-m"].Split(" "); foreach (var it in ppp) { var pp = it.Split("=>"); ParseInputIpPort(pp[0], out string ipO, out ushort portO); ParseInputIpPort(pp[1], out string ipM, out ushort portM); map.Add(new IPEndPoint(IPAddress.Parse(ipO), portO), new IPEndPoint(IPAddress.Parse(ipM), portM)); } } else { Logger.Error.WriteLine("No Map Para!"); } UDPSender sender = new UDPSender(); core = new Core.ReplayCore(paths); // 获取文件 info _fInfo = core.FileInfo; //Core.ReplayCore.DeleSendHandler sendHandler = (ReadOnlySpan<byte> bytes, IPEndPoint point) => //{ // sender.Send(bytes.ToArray(), point); //}; Core.ReplayCore.DeleSendHandler sendHandler = (Core.ReplayCore.SendInfo msg) => { sender.Send(msg.bytes.ToArray(), msg.point); }; Core.ReplayCore.DeleInfoHandler infoHandler = (Core.ReplayCore.ReplayInfo info) => { Console.WriteLine(info.time + ": " + (100.0 * (double)info.index / ((double)_fInfo.totalIndex - 1)).ToString("f2") + "%" + " " + info.index + " " + info.pkgCostTime); }; // 设置回放的 point map // 设置回放的 sendHandler 需要注意此处的委托只能做发送 需要尽可能快的返回 // 设置回放的 infoHandler 此处是异步触发 core.Initial(map, sendHandler, infoHandler); Logger.Info.WriteLine("TotalIndex: " + _fInfo.totalIndex + " StartTime: " + _fInfo.time + " TotalTime: " + _fInfo.totalIndex * _fInfo.timeInterval + "s"); Logger.Info.WriteLine("Notes: " + _fInfo.notes); Logger.Info.WriteLine("Maps: "); foreach (var point in _fInfo.points) { if (map.ContainsKey(point)) { Logger.Info.WriteLine(point + " => " + map[point]); } else { Logger.Info.WriteLine(point + " => "); } } }