/// <summary> /// 脚本内容改变 /// </summary> /// <param name="sender">事件发送者</param> /// <param name="e">事件参数</param> private void luaEdit1_OnChange(object sender, EventArgs e) { string scriptName = m_filename; if (scriptName.IndexOf('\\') != -1) { scriptName = scriptName.Substring(scriptName.LastIndexOf('\\') + 1); } if (scriptType == "localFile") // 本地文件跳过加锁机制 { this.Text = scriptName + "*"; return; } if (isLocked) // 已经锁了,没人会再改掉服务器端了,忽略检查吧 { return; } if (IsChanged) // 真的改了 { DataBaseManager databaseManager = DataBaseManager.GetDataBaseManager(); string strServerContent = databaseManager.GetScriptData(this.m_id); if (strServerContent == null) { MessageBox.Show("校验服务器端文件失败,可能服务器端文件已删除。", "锁定脚本", MessageBoxButtons.OK, MessageBoxIcon.Error); this.luaEditBox.Text = ""; this.luaEditBox.Text = this.ScriptCode; return; } if (strServerContent != this.ScriptCode) { MessageBox.Show("服务器端的文件已被修改过,要重新加载最新内容!", "锁定脚本", MessageBoxButtons.OK, MessageBoxIcon.Information); this.ScriptCode = strServerContent; } // 加锁前先解锁 如果是自己加锁后程序崩溃了,再次启动编辑可以解自己以前加的锁。前提是自己不能unlock别人的锁(待考证) databaseManager.UnLockScript(this.ID); // 正式加锁 bool bret = databaseManager.LockScript(this.m_id); if (bret) { // 锁定成功,那么置修改标志于文件名后 this.Text = scriptName + "*"; this.isLocked = true; } else { //锁定失败,说明被别人锁了(由于LockScript中包含报错界面,故我就不重复报错了再) this.luaEditBox.Text = this.ScriptCode; } } }
private void btnReplace_Click(object sender, EventArgs e) { if (MessageBox.Show("替换结果将不直接写入数据库,而且不能恢复,确认继续操作?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2) != DialogResult.Yes) { return; } SetControlsEnabled(false); if (treePreview.Nodes.Count == 0) { MessageBox.Show("请先搜索出文件,再针对文件进行替换!"); SetControlsEnabled(true); return; } DataBaseManager dbm = DataBaseManager.GetDataBaseManager(); //第1步 检查锁 foreach (TreeNode tn_file in treePreview.Nodes) { if (!tn_file.Checked) { continue; } Hashtable ht_file = tn_file.Tag as Hashtable; string strID = ht_file["id"].ToString(); if (dbm.IsScriptLocked(strID)) { //文件锁了 MessageBox.Show("失败:文件[" + tn_file.Text + "]被正在被人编辑,无法启动替换。"); SetControlsEnabled(true); return; } } //第2步 检查在选择过程中,选中项的服务器端数据变过没有 foreach (TreeNode tn_file in treePreview.Nodes) { if (!tn_file.Checked) { continue; } Hashtable ht_file = tn_file.Tag as Hashtable; string strFileContent = ht_file["strFileContent"].ToString(); string strID = ht_file["id"].ToString(); if (strFileContent != dbm.GetScriptData(strID)) { //服务器端变过了 MessageBox.Show("失败:查找之后,替换之前,文件内容已变更,所以无法替换,请重新启动替换程序!"); SetControlsEnabled(true); return; } } //第3步 锁定选择项 foreach (TreeNode tn_file in treePreview.Nodes) { if (!tn_file.Checked) { continue; } Hashtable ht_file = tn_file.Tag as Hashtable; string strID = ht_file["id"].ToString(); if (!dbm.LockScript(strID)) { MessageBox.Show("失败:检查一致性的过程中有人锁定了脚本,请迅速保存所有文件后重新运行脚本编辑器再次替换。"); SetControlsEnabled(true); return; } } //第4步 替换选择项 string strResult = ""; string strFind = findTextBox.Text; string strReplace = replaceTextBox.Text; foreach (TreeNode tn_file in treePreview.Nodes) { if (!tn_file.Checked) { continue; } Hashtable ht_file = tn_file.Tag as Hashtable; string strContent = ""; foreach (TreeNode tnz in tn_file.Nodes) { Hashtable ht_nodez = tnz.Tag as Hashtable; strContent += ht_nodez["line_before"].ToString(); if (!tnz.Checked) { strContent += strFind; } else { strContent += strReplace; } } strContent += ht_file["line_last"].ToString(); string strView = ""; bool ret = dbm.SaveScriptData(tn_file.Text, strContent, out strView); strResult += tn_file.Text + (ret ? "...OK\n" : "...NG\n"); } //第5步 解锁选择项 foreach (TreeNode tn_file in treePreview.Nodes) { if (!tn_file.Checked) { continue; } Hashtable ht_file = tn_file.Tag as Hashtable; string strID = ht_file["id"].ToString(); if (!dbm.UnLockScript(strID)) { MessageBox.Show(strResult + "成功:替换完成后解锁失败,原因不明,请联系管理员"); SetControlsEnabled(true); return; } } MessageBox.Show("替换完成!");//\n" + strResult); treePreview.Nodes.Clear(); wbPriview.DocumentText = ""; SetControlsEnabled(true); }