using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Windows.Forms; namespace Project { public static class Util { public static Boolean TouchKeyShow(TextBox tb,string title) { //입력창 표시 var f = new Dialog.fTouchKeyFull(title, tb.Text); if (f.ShowDialog() == DialogResult.OK) { tb.Text = f.tbInput.Text; tb.Focus(); tb.SelectAll(); return true; } else return false; } #region "MessageBox" public static void MsgI(string m, Boolean legacy = false) { if (legacy) MessageBox.Show(m, "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); else { var f = new fMsgQuestion("알림\n" + m, "확인", ""); f.lbTitle.BackColor = Color.DeepSkyBlue; f.lbTitle.BackColor2 = Color.DodgerBlue; f.EnableUserClose = true; f.DialogMode = true; f.ShowDialog(); } } public static void MsgE(string m, Boolean legacy = false) { if (legacy) { MessageBox.Show(m, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { var f = new fMsgQuestion("오류 알림\n" + m, "확인", ""); f.lbTitle.BackColor = Color.Red; f.lbTitle.BackColor2 = Color.Red; f.EnableUserClose = true; f.DialogMode = true; f.ShowDialog(); } } public static DialogResult MsgQ(string m, string btOK = "확인", string btCancel = "아니오") { var f = new fMsgQuestion("선택 알림\n" + m, btOK, btCancel); f.lbTitle.BackColor = Color.DeepSkyBlue; f.lbTitle.BackColor2 = Color.DodgerBlue; f.EnableUserClose = true; f.DialogMode = true; var dlg = f.ShowDialog(); return dlg; } #endregion public static string JobListToFile(Class.CHistoryJOB data, string jobdate, string jobseq, out int cnt) { cnt = 0; if (string.IsNullOrEmpty(jobdate)) return string.Empty; //이미저장된 목록을 가져오고 중복된것은 피한다 var preSavedFile = System.IO.Path.Combine(Pub.setting.Path_Data, "JobData", jobdate.Substring(0, 6), jobdate + "-" + jobseq + ".txt"); List preList = new List(); if (System.IO.File.Exists(preSavedFile)) preList.AddRange(System.IO.File.ReadAllLines(preSavedFile, System.Text.Encoding.UTF8)); //Temp var fiName = System.IO.Path.Combine(Pub.setting.Path_Data, "UploadTemp", jobdate + "_" + jobseq + ".tab"); var fi = new System.IO.FileInfo(fiName); if (fi.Directory.Exists == false) fi.Directory.Create(); var sb = new System.Text.StringBuilder(); sb.AppendLine("#Time\tSID\tRID\tRAW"); var oklist = data.Items.Where(t => t.VisionData.RID.isEmpty() == false).ToArray(); foreach (var item in oklist) { //기존에 전송한 목록에 없어야 한다 if (item.error == Class.JobData.ErrorCode.None && item.VisionData.RID.isEmpty() == false) { sb.AppendLine(string.Format("{0}\t{1}\t{2}\t{3}", item.JobStart.ToString("yyyy-MM-dd HH:mm:sss"), item.VisionData.SID, item.VisionData.RID, item.VisionData.QROutRaw)); cnt += 1; } } try { System.IO.File.WriteAllText(fi.FullName, sb.ToString(), System.Text.Encoding.UTF8); return fi.FullName; } catch (Exception ex) { Pub.log.AddE("JobListToFile:" + ex.Message); return string.Empty; } } public static bool SendMail(string seqdate, string seqno) { Chilkat.MailMan mailman = new Chilkat.MailMan(); bool success = mailman.UnlockComponent("BLUPRT.CBX012020_rzDFf7pQAsCS"); if (success != true) { Debug.WriteLine(mailman.LastErrorText); return false; } mailman.SmtpHost = "10.101.10.6"; mailman.SmtpPort = 25; // Create a new email object Chilkat.Email email = new Chilkat.Email(); var mailform = Pub.mailForm.FirstOrDefault(); if (mailform == null) return false; var subject = mailform.subject.Trim(); subject = subject.Replace("{seqdate}", seqdate); subject = subject.Replace("{seqno}", seqno); var buffer = System.IO.File.ReadAllText(Util.CurrentPath + "\\Mailform.html"); //시드별집계데이터생성 System.Text.StringBuilder sbFileSID = new StringBuilder(); System.Text.StringBuilder sbFileREEL = new StringBuilder(); sbFileSID.AppendLine(string.Format("NO,SID,작업수량,예정수량,UNIT")); sbFileREEL.AppendLine(string.Format("NO,SID,REEL,QTY,TIME")); // int cntrid = 1; System.IO.File.WriteAllText(Util.CurrentPath + "\\result_sidsummary.csv", sbFileSID.ToString(), System.Text.Encoding.Default); System.IO.File.WriteAllText(Util.CurrentPath + "\\result_reelist.csv", sbFileREEL.ToString(), System.Text.Encoding.Default); //메일본문의 내용 치환 var contents = buffer.Trim(); contents = contents.Replace("{seqdate}", seqdate); contents = contents.Replace("{seqno}", seqno); email.Subject = subject; email.SetHtmlBody(contents); email.From = "ReelSorter"; email.AddFileAttachment(Util.CurrentPath + "\\result_sidsummary.csv"); email.AddFileAttachment(Util.CurrentPath + "\\result_reelist.csv"); System.Text.StringBuilder maillist = new StringBuilder(); foreach (DataSet1.MailRecipientRow r in Pub.mailList.Rows) { success = email.AddTo(r.Name, r.Address); maillist.Append(string.Format("{0}({1})", r.Name, r.Address)); } success = mailman.SendEmail(email); if (success != true) { Debug.WriteLine(mailman.LastErrorText); return false; } success = mailman.CloseSmtpConnection(); if (success != true) { Debug.WriteLine("Connection to SMTP server not closed cleanly."); Pub.log.AddE("메일 발송 실패(" + maillist.ToString() + ")"); } Pub.log.AddI("메일 발송 완료(" + maillist.ToString() + ")"); return true; } public static T FileDeSerialize(string file) { T Retval = default(T); if (System.IO.File.Exists(file) == false) return Retval; var xmlSerializer = new BinaryFormatter(); using (FileStream fs = new FileStream(file, FileMode.Open)) { try { var value = xmlSerializer.Deserialize(fs); Retval = (T)Convert.ChangeType(value, typeof(T)); } catch (Exception ex) { Pub.log.AddE("File DeSerialized Error : " + ex.Message); } //Retval = (T)xmlSerializer.Deserialize(fs); } return Retval; } public static void FileSerialize(object data, string file) { if (data == null) return; var xmlSerializer = new BinaryFormatter(); using (FileStream fs = new FileStream(file, FileMode.Create)) { xmlSerializer.Serialize(fs, data); } } public static void splitID(string ID, out string ww, out string seq) { if (ID.Length < 3) { ww = ""; seq = ""; } else { try { ww = ID.Substring(0, 2);// int.Parse(ID.Substring(0, 2)); seq = ID.Substring(2);// int.Parse(ID.Substring(2)); } catch (Exception ex) { Pub.log.AddE("slit id eerr" + ex.Message); ww = ""; seq = "-1"; } } } public static void ScreenCaptrue(int _BitmapWidth, int _BitmapHeight, Point ptSouce) { try { Bitmap bitmap = new Bitmap(_BitmapWidth, _BitmapHeight); Graphics _graphic = Graphics.FromImage(bitmap); _graphic.CopyFromScreen(ptSouce, new Point(0, 0), new Size(_BitmapWidth, _BitmapHeight)); string savefile = System.IO.Path.Combine(Util.CurrentPath, "ScreenShot", DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"); System.IO.FileInfo grpath = new FileInfo(savefile); if (!grpath.Directory.Exists) grpath.Directory.Create(); bitmap.Save(grpath.FullName, System.Drawing.Imaging.ImageFormat.Png); Util.MsgI("화면 캡쳐 성공\n" + "위치:" + grpath.Directory.FullName + "\n" + "파일명: " + grpath.Name); } catch (Exception ex) { Util.MsgE("화면 캡쳐 실패\n" + ex.Message); } } public static void SaveBugReport(string content, string subdirName = "BugReport") { try { var path = CurrentPath + subdirName; if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); var file = path + "\\" + DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + ".txt"; System.IO.File.WriteAllText(file, content, System.Text.Encoding.UTF8); } catch { //nothing } } public static void CopyData(System.Data.DataRow drSrc, System.Data.DataRow drDes) { if (drDes == null || drSrc == null) return; foreach (System.Data.DataColumn col in drSrc.Table.Columns) { if (col.ColumnName.ToUpper() == "IDX") continue; drDes[col.ColumnName] = drSrc[col.ColumnName]; } } /// /// 현재실행중인폴더를 반환합니다. /// public static string CurrentPath { get { return AppDomain.CurrentDomain.BaseDirectory; } } /// /// 콤마와 줄바꿈등을 제거합니다. /// /// public static string ToCSVString(string src) { string retval = src.Replace("\r", "").Replace("\n", "").Replace(",", ""); return retval; } public static Boolean RunProcess(string file, string arg = "") { var fi = new System.IO.FileInfo(file); if (!fi.Exists) { Pub.log.AddE("Run Error : " + file); return false; } System.Diagnostics.Process prc = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(file); si.Arguments = arg; prc.StartInfo = si; prc.Start(); return true; } #region "convert" public static string RectToStr(Rectangle rect) { return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); } public static string RectToStr(RectangleF rect) { return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); } public static string PointToStr(Point pt) { return string.Format("{0};{1}", pt.X, pt.Y); } public static string PointToStr(PointF pt) { return string.Format("{0};{1}", pt.X, pt.Y); } public static Rectangle StrToRect(string str) { if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0"; var roibuf1 = str.Split(';'); return new System.Drawing.Rectangle( int.Parse(roibuf1[0]), int.Parse(roibuf1[1]), int.Parse(roibuf1[2]), int.Parse(roibuf1[3])); } public static RectangleF StrToRectF(string str) { if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0"; var roibuf1 = str.Split(';'); return new System.Drawing.RectangleF( float.Parse(roibuf1[0]), float.Parse(roibuf1[1]), float.Parse(roibuf1[2]), float.Parse(roibuf1[3])); } public static Point StrToPoint(string str) { if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0"; var roibuf1 = str.Split(';'); return new System.Drawing.Point( int.Parse(roibuf1[0]), int.Parse(roibuf1[1])); } public static PointF StrToPointF(string str) { if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0"; var roibuf1 = str.Split(';'); return new System.Drawing.PointF( float.Parse(roibuf1[0]), float.Parse(roibuf1[1])); } #endregion #region "NIC" /// /// 지정된 nic카드가 현재 목록에 존재하는지 확인한다. /// /// public static Boolean ExistNIC(string NICName) { if (string.IsNullOrEmpty(NICName)) return false; foreach (string NetName in NICCardList()) { if (NetName.ToLower() == NICName.ToLower()) { return true; } } return false; } /// /// Ehternet Card 를 사용안함으로 설정합니다.(관리자권한필요) /// /// public static Boolean NICDisable(string NICName) { //해당 nic 가 현재 목록에 존재하는지 확인한다. string cmd = "interface set interface " + NICName + " disable"; Process prc = new Process(); ProcessStartInfo si = new ProcessStartInfo("netsh", cmd); si.WindowStyle = ProcessWindowStyle.Hidden; prc.StartInfo = si; prc.Start(); ////목록에서 사라질때까지 기다린다. DateTime SD = DateTime.Now; Boolean timeout = false; while ((true)) { bool FindNetwork = false; foreach (string NetName in NICCardList()) { if (NetName == NICName.ToLower()) { FindNetwork = true; break; // TODO: might not be correct. Was : Exit For } } if (!FindNetwork) break; // TODO: might not be correct. Was : Exit While System.Threading.Thread.Sleep(1000); TimeSpan ts = DateTime.Now - SD; if (ts.TotalSeconds > 10) { timeout = true; break; // TODO: might not be correct. Was : Exit While } } return !timeout; } public static List NICCardList() { List Retval = new List(); foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) { if (Net.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) { Retval.Add(Net.Name.ToUpper()); } } return Retval; } /// /// 이더넷카드를 사용함으로 설정합니다. /// /// public static Boolean NICEnable(string NICName) { string cmd = "interface set interface " + NICName + " enable"; System.Diagnostics.Process prc = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("netsh", cmd); si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; prc.StartInfo = si; prc.Start(); ////목록에생길떄까지 대기 DateTime SD = DateTime.Now; while ((true)) { bool FindNetwork = false; foreach (string NetName in NICCardList()) { if (NetName.ToLower() == NICName.ToLower()) { FindNetwork = true; break; // TODO: might not be correct. Was : Exit For } } if (FindNetwork) break; // TODO: might not be correct. Was : Exit While System.Threading.Thread.Sleep(1000); TimeSpan ts = DateTime.Now - SD; if (ts.TotalSeconds > 10) { return false; } } ////결이 완료될떄까지 기다린다. SD = DateTime.Now; while ((true)) { bool FindNetwork = false; foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) { if (Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.GigabitEthernet && Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) continue; if (Net.Name.ToLower() == NICName.ToLower()) { //string data = Net.GetIPProperties().GatewayAddresses[0].ToString(); if (Net.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) { FindNetwork = true; break; // TODO: might not be correct. Was : Exit For } } } if (FindNetwork) return true; System.Threading.Thread.Sleep(1000); TimeSpan ts = DateTime.Now - SD; if (ts.TotalSeconds > 10) { return false; } } } #endregion public static void RunExplorer(string arg) { System.Diagnostics.ProcessStartInfo si = new ProcessStartInfo("explorer"); si.Arguments = arg; System.Diagnostics.Process.Start(si); } #region "watchdog" public static void WatchDog_Run() { System.IO.FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "WatchCat.exe"); if (!fi.Exists) return; var Exist = CheckExistProcess("watchcat"); if (Exist != null) return; RunProcess(fi.FullName); } public static System.Diagnostics.Process CheckExistProcess(string ProcessName) { foreach (var prc in System.Diagnostics.Process.GetProcesses()) { if (prc.ProcessName.StartsWith("svchost")) continue; if (prc.ProcessName.ToUpper() == ProcessName.ToUpper()) return prc; } return null; } #endregion #region "web function" /// /// URL로부터 문자열을 수신합니다. /// /// /// /// public static string GetStrfromurl(string url, out Boolean isError) { isError = false; string result = ""; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); request.Timeout = 60000; request.ReadWriteTimeout = 60000; request.MaximumAutomaticRedirections = 4; request.MaximumResponseHeadersLength = 4; request.Credentials = CredentialCache.DefaultCredentials; var response = request.GetResponse() as HttpWebResponse; var txtReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); result = txtReader.ReadToEnd(); } catch (Exception ex) { isError = true; result = ex.Message.ToString(); } return result; } #endregion } }