hrz_sv / 01.Manager / 00.Program / Manager / Process_Cmd.cs
이력 | 보기 | 이력해설 | 다운로드 (5.21 KB)
| 1 | 37 | HKM | using System; |
|---|---|---|---|
| 2 | using System.Collections.Generic; |
||
| 3 | using System.Diagnostics; |
||
| 4 | using System.Linq; |
||
| 5 | using System.Text; |
||
| 6 | using System.Threading.Tasks; |
||
| 7 | using System.Windows.Forms; |
||
| 8 | |||
| 9 | namespace Manager |
||
| 10 | {
|
||
| 11 | public class Process_Cmd |
||
| 12 | {
|
||
| 13 | #region [ Variable ] |
||
| 14 | |||
| 15 | ProcessStartInfo procInfo; |
||
| 16 | |||
| 17 | Process process; |
||
| 18 | |||
| 19 | public bool isProcessAlive = false; |
||
| 20 | |||
| 21 | /// <summary> |
||
| 22 | /// 결과를 출력할 리스트 박스 |
||
| 23 | /// </summary> |
||
| 24 | ListBox resultListBox; |
||
| 25 | |||
| 26 | #endregion |
||
| 27 | |||
| 28 | public void SetListBox(ListBox inputListbox_) |
||
| 29 | {
|
||
| 30 | resultListBox = inputListbox_; |
||
| 31 | } |
||
| 32 | |||
| 33 | |||
| 34 | public Process_Cmd() |
||
| 35 | {
|
||
| 36 | procInfo = new ProcessStartInfo(); |
||
| 37 | } |
||
| 38 | |||
| 39 | void CreateProcess() |
||
| 40 | {
|
||
| 41 | process = new Process(); |
||
| 42 | process.StartInfo = procInfo; |
||
| 43 | process.EnableRaisingEvents = true; // 이벤트가 발생하게 해준다. |
||
| 44 | process.Exited += new EventHandler(Process_Exited); // Process 가 끝날때의 이벤트 |
||
| 45 | process.OutputDataReceived += new DataReceivedEventHandler(OutputDataReceive_Handler); |
||
| 46 | |||
| 47 | } |
||
| 48 | |||
| 49 | /// <summary> |
||
| 50 | /// Process 의 정보 값들을 초기화 해줍니다. |
||
| 51 | /// </summary> |
||
| 52 | /// <param name="inputPath_"></param> |
||
| 53 | /// <param name="inputArguments_"></param> |
||
| 54 | public void SetProcess(string inputPath_, string inputArguments_) |
||
| 55 | {
|
||
| 56 | procInfo.FileName = inputPath_; // 프로그램 경로 |
||
| 57 | procInfo.Arguments = inputArguments_; // 매개변수의 경로 |
||
| 58 | |||
| 59 | procInfo.WindowStyle = ProcessWindowStyle.Hidden; // cmd창이 숨겨지도록 하기 |
||
| 60 | procInfo.CreateNoWindow = true; // cmd창을 띄우지 안도록 하기 |
||
| 61 | |||
| 62 | procInfo.UseShellExecute = false; |
||
| 63 | procInfo.RedirectStandardOutput = true; // cmd창에서 데이터를 가져오기 |
||
| 64 | procInfo.RedirectStandardInput = true; // cmd창으로 데이터 보내기 |
||
| 65 | procInfo.RedirectStandardError = true; // cmd창에서 오류 내용 가져오기 |
||
| 66 | |||
| 67 | } |
||
| 68 | |||
| 69 | /// <summary> |
||
| 70 | /// 프로세스가 시작됩니다. |
||
| 71 | /// </summary> |
||
| 72 | public void StartProcess() |
||
| 73 | {
|
||
| 74 | try |
||
| 75 | {
|
||
| 76 | if(process == null) |
||
| 77 | {
|
||
| 78 | CreateProcess(); |
||
| 79 | } |
||
| 80 | |||
| 81 | process.Start(); // Process가 시작된다. |
||
| 82 | |||
| 83 | process.BeginOutputReadLine(); // output 되는 라인들을 잡아오기 시작한다. |
||
| 84 | |||
| 85 | isProcessAlive = true; |
||
| 86 | } |
||
| 87 | catch (Exception e) |
||
| 88 | {
|
||
| 89 | Console.WriteLine(e.ToString()); |
||
| 90 | } |
||
| 91 | } |
||
| 92 | |||
| 93 | /// <summary> |
||
| 94 | /// 프로세스에 메시지를 보냅니다. |
||
| 95 | /// </summary> |
||
| 96 | /// <param name="inputString_"></param> |
||
| 97 | public void Msg(string inputString_) |
||
| 98 | {
|
||
| 99 | if (process.HasExited == true) |
||
| 100 | process.Start(); |
||
| 101 | |||
| 102 | process.StandardInput.Write(@inputString_ + Environment.NewLine); |
||
| 103 | |||
| 104 | // 명령어를 보낼때는 꼭 마무리를 해줘야 한다. 그래서 마지막에 NewLine가 필요하다 |
||
| 105 | //process.StandardInput.Close(); |
||
| 106 | |||
| 107 | //string result = process.StandardOutput.ReadToEnd(); |
||
| 108 | //StringBuilder sb = new StringBuilder(); |
||
| 109 | //sb.Append("[Result Info]" + DateTime.Now + "\r\n");
|
||
| 110 | //sb.Append(result); |
||
| 111 | //sb.Append("\r\n");
|
||
| 112 | |||
| 113 | //textBox1.Text = sb.ToString(); |
||
| 114 | |||
| 115 | //Form_Manager.instance.Label_Result_Modify(sb.ToString()); |
||
| 116 | |||
| 117 | //process.WaitForExit(); |
||
| 118 | //process.Close(); |
||
| 119 | } |
||
| 120 | |||
| 121 | /// <summary> |
||
| 122 | /// 프로세스가 종료됩니다. |
||
| 123 | /// </summary> |
||
| 124 | public void ExitProcess() |
||
| 125 | {
|
||
| 126 | process.CancelOutputRead(); |
||
| 127 | |||
| 128 | process.Kill(); |
||
| 129 | |||
| 130 | |||
| 131 | //process.StandardInput.Close(); |
||
| 132 | //process.WaitForExit(); |
||
| 133 | //process.Close(); |
||
| 134 | } |
||
| 135 | |||
| 136 | /// <summary> |
||
| 137 | /// 프로세스가 꺼진 상황의 이벤트 입니다. |
||
| 138 | /// </summary> |
||
| 139 | /// <param name="sender"></param> |
||
| 140 | /// <param name="e"></param> |
||
| 141 | private void Process_Exited(object sender, EventArgs e) |
||
| 142 | {
|
||
| 143 | Console.WriteLine("process_exited");
|
||
| 144 | |||
| 145 | isProcessAlive = false; |
||
| 146 | } |
||
| 147 | |||
| 148 | /// <summary> |
||
| 149 | /// process 에서 출력되는 string 들을 list box에 출력해주는 함수. |
||
| 150 | /// </summary> |
||
| 151 | /// <param name="sender"></param> |
||
| 152 | /// <param name="e"></param> |
||
| 153 | private void OutputDataReceive_Handler(object sender, DataReceivedEventArgs e) |
||
| 154 | {
|
||
| 155 | if (resultListBox == null) |
||
| 156 | return; |
||
| 157 | |||
| 158 | resultListBox.Invoke(new Action(() => |
||
| 159 | {
|
||
| 160 | if (e.Data == null) |
||
| 161 | return; |
||
| 162 | |||
| 163 | resultListBox.Items.Add(e.Data); |
||
| 164 | })); |
||
| 165 | } |
||
| 166 | } |
||
| 167 | } |