259 lines
12 KiB
C#
259 lines
12 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|