using ICSharpCode.SharpZipLib.Zip; using Server.Utils; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Server.Winforms { internal partial class InitMysqlForm : DefaultForm { Client Client; public InitMysqlForm(Client Client) { InitializeComponent(); this.Client = Client; } private void InitMysqlForm_Load(object sender, EventArgs e) { } private void SetStatusText(string text) { if (!this.IsDisposed) { this.Invoke(new Action(delegate () { this.tool_status.Text = text; })); } } public void DownloadFile(string URL, string filename, ProgressBar prog = null) { float percent = 0; if (File.Exists(filename)) File.Delete(filename); Stream st = null; Stream so = null; System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); long totalBytes = myrp.ContentLength; prog?.Invoke(new Action(delegate { prog.Value = 0; prog.Maximum = (int)totalBytes; })); st = myrp.GetResponseStream(); so = new System.IO.FileStream(filename, System.IO.FileMode.Create); try { long totalDownloadedByte = 0; byte[] by = new byte[1024]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { totalDownloadedByte = osize + totalDownloadedByte; Application.DoEvents(); so.Write(by, 0, osize); prog?.Invoke(new Action(delegate { prog.Value = (int)totalDownloadedByte; })); osize = st.Read(by, 0, (int)by.Length); percent = (float)totalDownloadedByte / (float)totalBytes * 100; if (prog != null) Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息 } } catch (Exception ex) { if (File.Exists(filename)) File.Delete(filename); if (so != null) { so.Close(); so.Dispose(); so = null; } if (st != null) { st.Close(); st.Dispose(); st = null; } throw ex; } finally { if (so != null) { so.Close(); so.Dispose(); so = null; } if (st != null) { st.Close(); st.Dispose(); st = null; } } } /// /// 功能:解压zip格式的文件。 /// /// 压缩文件路径 /// 解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 /// 出错信息 /// 解压是否成功 public void UnZip(string zipFilePath, string unZipDir) { try { if (zipFilePath == string.Empty) { throw new Exception("压缩文件不能为空!"); } if (!File.Exists(zipFilePath)) { throw new System.IO.FileNotFoundException("压缩文件不存在!"); } //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 if (unZipDir == string.Empty) unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath)); if (!unZipDir.EndsWith("/")) unZipDir += "/"; if (!Directory.Exists(unZipDir)) Directory.CreateDirectory(unZipDir); using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); if (directoryName.Length > 0) { Directory.CreateDirectory(unZipDir + directoryName); } if (!directoryName.EndsWith("/")) directoryName += "/"; if (fileName != String.Empty) { using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)) { int size = 1024 * 10; byte[] data = new byte[size]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } } } } catch (Exception ex) { //如果解压失败,删除掉. 刚刚解压的内容 DeletePath(unZipDir); throw ex; } } //创建方法,删除文件夹中的所有文件包括文件夹本身 public void DeletePath(string file) { try { //去除文件夹和子文件的只读属性 //去除文件夹的只读属性 System.IO.DirectoryInfo fileInfo = new DirectoryInfo(file); fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory; //去除文件的只读属性 System.IO.File.SetAttributes(file, System.IO.FileAttributes.Normal); //判断文件夹是否还存在 if (Directory.Exists(file)) { foreach (string f in Directory.GetFileSystemEntries(file)) { if (File.Exists(f)) { //如果有子文件删除文件 File.Delete(f); } else { //循环递归删除子文件夹 DeletePath(f); } } //删除空文件夹 Directory.Delete(file); } } catch (Exception) { } } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; Task.Factory.StartNew(delegate () { try { var mysql_name = textBox1.Text.Trim().ToLower(); var mysql_port = (int)numericUpDown1.Value; var mysql_user = textBox2.Text.Trim(); var mysql_pass = textBox3.Text.Trim(); var mysql_host = textBox4.Text.Trim(); SetStatusText("正在检测..."); if (this.radioButton1.Checked) { var ServerName = "mysql8.0"; var Server = ServiceInstaller.GetServiceController(ServerName); if (Server == null) { var mysqlPath = @"C:\mysql8.0"; //确认没有解压文件 if (!System.IO.Directory.Exists(mysqlPath)) { //找到压缩包 var mysqlFile = CsharpHttpHelper.HttpExtend.MapFile("mysql8.0.zip", "File"); if (!File.Exists(mysqlFile)) { SetStatusText("正在下载mysql8.0安装包..."); DownloadFile("http://qiniu.down.api.52cmg.cn/mysql8.0.zip", mysqlFile); } if (!File.Exists(mysqlFile)) throw new Exception("找不到mysql8.0的安装包"); SetStatusText("正在安装mysql8.0..."); UnZip(mysqlFile, mysqlPath); } Thread.Sleep(1000); ServiceInstaller.InitServer(@"C:\mysql8.0\bin\mysqld", ServerName); Server = ServiceInstaller.GetServiceController(ServerName); int index = 0; while (index < 30 && Server == null) { index++; System.Threading.Thread.Sleep(1000); Server = ServiceInstaller.GetServiceController(ServerName); } } if (Server == null) { throw new Exception("安装失败,请联系客服人员处理"); } else if (Server.Status == System.ServiceProcess.ServiceControllerStatus.Running) { SetStatusText("MySQL 8.0 环境监测通过!"); } else { Server.Start(); SetStatusText("MySQL 8.0 环境监测通过!"); } mysql_name = "fanli_v2"; mysql_user = "root"; mysql_pass = "123456"; mysql_port = 3306; mysql_host = "127.0.0.1"; } else { if (string.IsNullOrEmpty(mysql_name)) mysql_name = "fanli_v2"; } SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = $"Data Source={mysql_host};Persist Security Info=True;User ID={mysql_user};Password={mysql_pass};Port={mysql_port};Min Pool Size = 1; Max Pool Size = 1;Charset=utf8mb4;",//连接符字串 DbType = SqlSugar.DbType.MySql, //数据库类型 IsAutoCloseConnection = true //不设成true要手动close }); var DbList = db.DbMaintenance.GetDataBaseList(db); if (!DbList.Contains(mysql_name)) { // COLLATE utf8mb4_general_ci if (db.Ado.ExecuteCommand($"CREATE DATABASE {mysql_name} DEFAULT CHARACTER SET utf8mb4 ;") == 0) { throw new Exception("自动创建数据库失败!"); } } Client.Config.Ini.SetValue("Mysql", "名称", mysql_name); Client.Config.Ini.SetValue("Mysql", "账号", mysql_user); Client.Config.Ini.SetValue("Mysql", "密码", mysql_pass); Client.Config.Ini.SetValue("Mysql", "IP", mysql_host); Client.Config.Ini.SetValue("Mysql", "端口", mysql_port.ToString()); Client.Config.MysqlPort = mysql_port; Client.Config.MysqlPass = mysql_pass; Client.Config.MysqlName = mysql_name; Client.Config.MysqlHost = mysql_host; Client.Config.MysqlUser = mysql_user; this.Invoke(new Action(delegate { this.DialogResult = DialogResult.Yes; this.Close(); })); } catch (Exception ex) { this.Invoke(new Action(delegate () { this.tool_status.Text = ex.Message; MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); })); } finally { //if (this.IsAccessible) { this.Invoke(new Action(delegate { this.button1.Enabled = true; })); } } }); } private void radioButton_CheckedChanged(object sender, EventArgs e) { groupBox2.Enabled = radioButton2.Checked; } } }