using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using SystemX.Common; using SystemX.Common.Archive; using SystemX.Net.BaseProtocol; using SystemX.Net.Schedule; using static SystemX.Net.Platform.Common.Util.LogMessage; namespace SystemX.Net.XAdaptor.PC { public partial class XAdaptorPC { private async void WatchSubProcess() { await Task.Delay(500).ConfigureAwait(false); while (!StateClientGetInformation) { await Task.Delay(10).ConfigureAwait(false); } while (!m_bTaskSubBlock) { await Task.Delay(10).ConfigureAwait(false); try { StreamCT.ThrowIfCancellationRequested(); } catch (OperationCanceledException CancelEx) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.XAdaptor.PC.XPCAdaptor : ProcessTask.WatchFailedFile]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); break; } // try { if (StateClientStreamSocketConnect == false) continue; /// /// 5분이상 기존 파일전송이 없을 경우 /// if (stFileSendTime.ElapsedMilliseconds < FILE_SEND_MAX_WAITTIME) goto ROUTINE_OUT; /// /// 직전 전송이 10초 이상 일때(완전 처리 대기) /// if (stBackupFileSendTime.ElapsedMilliseconds < FILE_SEND_INTERVAL_TIME) goto ROUTINE_OUT; if (bTaskSubLockState) goto ROUTINE_OUT; try { bTaskSubLockState = await _smpSlim.WaitAsync(100); if (bTaskSubLockState == false) goto ROUTINE_OUT; //Scan And Send File //오늘 포함 -6일전까지 검색 string[] strYYYY = new string[7]; string[] strMM = new string[7]; string[] strdd = new string[7]; for (int i = 6; i >= 0; i--) { DateTime dtSet = DateTime.Today.AddDays(-i); strYYYY[i] = dtSet.ToString("yyyy"); strMM[i] = dtSet.ToString("MM"); strdd[i] = dtSet.ToString("dd"); } // // 7일치 위치 확인 // for (int i = 0; i < 7; i++) { string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory); string DirPath = strGetRoot + $@"\XLog\FileFailedBackup\{LoadInfo.HOST_ID}\{LoadInfo.SECTION}\{strYYYY[i]}\{strMM[i]}\{strdd[i]}\"; string DirMovePath = strGetRoot + $@"\XLog\FileFailedBackup\{LoadInfo.HOST_ID}\{LoadInfo.SECTION}\{strYYYY[i]}\{strMM[i]}\{strdd[i]}\History\"; //생성 폴더가 없을경우 SKIP if (Directory.Exists(DirPath) == false) continue; if (Directory.Exists(DirMovePath) == false) Directory.CreateDirectory(DirMovePath); string fileExtension = "zip"; string[] dirs = Directory.GetDirectories(DirPath); string[] files = Directory.GetFiles(DirPath, $"*.{fileExtension}", SearchOption.TopDirectoryOnly); if (files.Length > 0) { string strExtractFilePos = string.Empty; string strOrgRemoveFilePos = string.Empty; string strHeaderInfo = string.Empty; string strLogFileNameInfo = string.Empty; foreach (string f in files) { strOrgRemoveFilePos = f; strHeaderInfo = string.Empty; strLogFileNameInfo = string.Empty; string[] strInfos = f.Split(';'); //파일정보 확인(로그 저장관련 정보) string strSetDateTime = strInfos[1]; string strSetStationName = strInfos[2]; int nSetTestListVariantNo = int.Parse(strInfos[3]); string strSetProcNoP = strInfos[4]; string strSetProcNoC = strInfos[5]; string strSetTestType = strInfos[6]; string strSetTestCode = strInfos[7]; string strSetVersion = strInfos[8]; string strSetProdCode = strInfos[9]; string strSetTestListCntID = strInfos[10]; int nSetTryNo = int.Parse(strInfos[11]); for (int n = 1; n < 10; n++) strHeaderInfo += (strInfos[n + 1] + ";"); strHeaderInfo = strHeaderInfo.Remove(strHeaderInfo.Length - 1, 1); //압축해제 하여 로그 파일 추출 using (FileStream fs = new FileStream(f, FileMode.Open)) using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Update, false)) { foreach (ZipArchiveEntry zae in zip.Entries) { strLogFileNameInfo = zae.FullName; if (strLogFileNameInfo.IndexOf(".txt") >= 0) continue; strExtractFilePos = DirPath + strLogFileNameInfo; zae.ExtractToFile(strExtractFilePos, true); } } //로그 파일 전송 if (await AsyncFailedLogFileTransfer(strExtractFilePos, strSetStationName, nSetTestListVariantNo, strSetProcNoP, strSetProcNoC, strSetTestType, strSetTestCode, strSetVersion, strSetProdCode, strSetTestListCntID) == eFileSendRecvResult.FileProcSuccess) { //성공시 string strCopyPos = DirMovePath; for (int n = 0; n < 10; n++) strCopyPos += (";" + strInfos[n + 1]); strCopyPos += (";" + nSetTryNo.ToString() + ";.zip"); File.Copy(f, strCopyPos, true); XAdaptorFileLogWrite(eSetFileLogCategory.FileLog, strYYYY[i], strMM[i], strdd[i], strHeaderInfo, strLogFileNameInfo, "FailedFileTrySend>Success"); } else { //실패시 nSetTryNo++; string strTryNo = string.Empty; string strCopyPos = string.Empty; //재시도 3회 초과 일시 히스토리로 이동 if (nSetTryNo > 3) { strCopyPos = DirMovePath; strTryNo = "X"; XAdaptorFileLogWrite(eSetFileLogCategory.FileLog, strYYYY[i], strMM[i], strdd[i], strHeaderInfo, strLogFileNameInfo, "FailedFileTrySend>UnprocessableFile"); } else { strCopyPos = DirPath; strTryNo = nSetTryNo.ToString(); XAdaptorFileLogWrite(eSetFileLogCategory.FileLog, strYYYY[i], strMM[i], strdd[i], strHeaderInfo, strLogFileNameInfo, "FailedFileTrySend>Fail"); } for (int n = 0; n < 10; n++) strCopyPos += (";" + strInfos[n + 1]); strCopyPos += (";" + strTryNo + ";.zip"); File.Copy(f, strCopyPos, true); } //압축해제 파일 삭제 File.Delete(strExtractFilePos); break; } //성공시나 실패시 새로운 파일생성 되기 때문에 기존 파일 삭제 if (strOrgRemoveFilePos != string.Empty) File.Delete(strOrgRemoveFilePos); break; } } stBackupFileSendTime.Restart(); } finally { if (bTaskSubLockState) { try { _smpSlim.Release(); } catch { ;//smp release lock exception } bTaskSubLockState = false; } } ROUTINE_OUT:; } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[SystemX.Net.XAdaptor.PC.XPCAdaptor : ProcessTask.WatchFailedFile]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } } } } }