/// <summary>
        /// 装载新版本工程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BTAddNew_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(Project.Folder) && !string.IsNullOrWhiteSpace(Project.JarFile))
            {
                //查询New仓库中,该工程的新版本
                string newPath = JarFileTool.GetNewPath(Project);
                if (Directory.Exists(newPath) && File.Exists(DirTool.Combine(newPath, Project.JarFile)))
                {
                    try
                    {
                        ToastForm.Display("装载中", $"正在装载 {Project.Name} 的新版本...", 'i', 5000);
                        //移动文件到发布仓库中
                        string aimPath = DirTool.Combine(R.Paths.PublishStorage, Project.Folder);                   //组合目标路径
                        DirTool.Create(aimPath);                                                                    //创建目标路径
                        if (Directory.Exists(DirTool.Combine(aimPath, (Project.LastVersion + 1).ToString())))       //如果存在目标文件夹
                        {
                            Directory.Delete(DirTool.Combine(aimPath, (Project.LastVersion + 1).ToString()), true); //删除目标文件夹(防止重复)
                        }
                        Directory.Move(newPath, DirTool.Combine(aimPath, (Project.LastVersion + 1).ToString()));    //开始移动
                                                                                                                    //添加新版本信息
                        Project.LastVersion++;
                        Project.CurrentVersion = Project.LastVersion;
                        ProjectVersionModel version = new ProjectVersionModel()
                        {
                            CreateTime = DateTime.Now,
                            Number     = Project.LastVersion,
                        };
                        if (Project.Versions == null)
                        {
                            Project.Versions = new List <ProjectVersionModel>();
                        }
                        Project.Versions.Add(version);
                        ToastForm.Display("装载成功", $"成功装载 {Project.Name} 的新版本", 'i', 5000);
                    }
                    catch
                    {
                        ToastForm.Display("装载失败", $"装载 {Project.Name} 的新版本失败", 'e', 5000);
                    }
                }
                else
                {
                    //没有发现新版本,不做处理
                    ToastForm.Display("装载失败", $"没有发现 {Project.Name} 的新版本", 'w', 5000);
                }
            }
            else
            {
                //没有工程配置信息,不做处理
                ToastForm.Display("装载失败", $"没有发现工程的配置信息", 'e', 5000);
            }

            //清除多余版本
            if (Project.VersionCache > 0 &&
                !string.IsNullOrWhiteSpace(Project.Folder) &&
                ListTool.HasElements(Project.Versions))
            {
                if (Project.Versions.Count > Project.VersionCache)
                {
                    List <ProjectVersionModel> _tempVers = Project.Versions.OrderByDescending(x => x.CreateTime).ToList();
                    List <ProjectVersionModel> _newVers  = new List <ProjectVersionModel>();
                    for (int i = 0; i < Project.VersionCache; i++)
                    {
                        _newVers.Add(_tempVers[i]);
                    }
                    for (int i = Project.VersionCache; i < Project.Versions.Count; i++)
                    {
                        string path = DirTool.Combine(R.Paths.PublishStorage, Project.Folder, (_tempVers[i].Number).ToString());
                        try
                        {
                            //如果文件夹存在,则删除文件夹及内容
                            if (Directory.Exists(path))
                            {
                                Directory.Delete(path, true);
                            }
                        }
                        catch
                        {
                            //如果删除失败,则继续保留该版本,等待下次继续删除
                            _newVers.Add(_tempVers[i]);
                        }
                    }
                    Project.Versions = _newVers;
                }
            }

            //重置项目信息
            SetProject(Project);
        }
 private void 浏览运行目录ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     ExplorerAPI.ExplorerFile(JarFileTool.GetFilePath(Project));
     ToastForm.Display("浏览", $"正在打开运行目录,请稍候...", 'i', 5000);
 }
        /// <summary>
        /// 根据工程设置启动服务
        /// </summary>
        /// <returns></returns>
        private void Start()
        {
            StatusUI(WorkStatus.正在启动);
            StartTime = DateTime.Now;

            //端口号是0,玩个蛋
            if (Project.Port == 0)
            {
                ToastForm.Display("启动失败", $"没有为 {Project.Name} 工程配置正儿八经的端口号", 'e', 5000);
                StatusUI(WorkStatus.启动失败);
                return;
            }
            if (!(ListTool.HasElements(Project.Versions) && Project.CurrentVersion != 0 && Project.LastVersion != 0))
            {
                //不存在版本或错误的版本(版本为0),不启动工程
                ToastForm.Display("启动失败", $"没有发现 {Project.Name} 工程的相关文件", 'e', 5000);
                StatusUI(WorkStatus.启动失败);
                return;
            }

            //存在版本,准备启动
            Task.Factory.StartNew(() =>
            {
                string cmd = $"java -jar {Project.Parameter} \"{JarFileTool.GetFilePath(Project)}\"";
                CMDProcessTool.Execute(cmd,
                                       new Action <string>((s) =>
                {
                    if (ConsoleCodeTool.IsLunchSuccess(s))
                    {
                        R.Log.i(s);
                        StatusUI(WorkStatus.启动成功);
                        Invoke(new Action(() =>
                        {
                            ToastForm.Display("启动成功", $"启动 {Project.Name} 工程成功", 'i', 5000);
                        }));
                    }

                    string log = ConsoleCodeTool.GetLogInfo(s);
                    if (!string.IsNullOrWhiteSpace(log))
                    {
                        R.Log.v(log);
                    }

                    //输出到窗口
                    if (ConsoleForm != null && !ConsoleForm.IsDisposed && ConsoleForm.Visible == true)
                    {
                        ConsoleForm.AddToQueue(s);
                    }
                }));

                if (Status == WorkStatus.启动成功 || Status == WorkStatus.端口占用 || Status == WorkStatus.正在关闭)
                {
                    StatusUI(WorkStatus.正在关闭);
                    Stop();
                }
                else
                {
                    StatusUI(WorkStatus.启动失败);
                }
            });
        }