From 8a9310397b96cd5ab5d21c1890a16947f54099cc Mon Sep 17 00:00:00 2001 From: hhsung Date: Mon, 11 Aug 2025 12:16:52 +0900 Subject: [PATCH] =?UTF-8?q?file=20=EC=B2=98=EB=A6=AC=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataAnalisys/AquarDataControl.cs | 81 +++++++++++++++++++ SmartAquaViewer/DataAnalisys/IWaterQuality.cs | 27 +++++++ 2 files changed, 108 insertions(+) create mode 100644 SmartAquaViewer/DataAnalisys/IWaterQuality.cs diff --git a/SmartAquaViewer/DataAnalisys/AquarDataControl.cs b/SmartAquaViewer/DataAnalisys/AquarDataControl.cs index 52cfb36..1c17ada 100644 --- a/SmartAquaViewer/DataAnalisys/AquarDataControl.cs +++ b/SmartAquaViewer/DataAnalisys/AquarDataControl.cs @@ -1,15 +1,96 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SmartAquaViewer.DataAnalisys { + + + internal class AquarDataControl { + private AQUA_DATA_CONTROL_STATE state = AQUA_DATA_CONTROL_STATE.IDLE; + private readonly IWaterQuality iwaterQuality; + private CancellationTokenSource? cts; + + public AquarDataControl(IWaterQuality iwaterQuality) + { + this.iwaterQuality = iwaterQuality; + } + + public AQUA_DATA_CONTROL_STATE GetState() => state; + + /// + /// 파일 파싱 시작 + /// + public void ParseFile(string filePath) + { + // --- 동기 처리 구간 --- + if (state != AQUA_DATA_CONTROL_STATE.IDLE && + state != AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED) + { + iwaterQuality.OnError("illegal state error : " + state); + return; + } + + state = AQUA_DATA_CONTROL_STATE.PROCESSING; + cts = new CancellationTokenSource(); + + // --- 비동기 처리 구간 --- + Task.Run(async () => + { + try + { + var fileInfo = new FileInfo(filePath); + long totalBytes = fileInfo.Length; + long processedBytes = 0; + + using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + using (var reader = new StreamReader(fs)) + { + string? line; + while ((line = await reader.ReadLineAsync()) != null) + { + cts.Token.ThrowIfCancellationRequested(); + + processedBytes += Encoding.UTF8.GetByteCount(line + Environment.NewLine); + double percent = (double)processedBytes / totalBytes * 100.0; + + iwaterQuality.OnProgress(percent); + + // TODO: 라인 파싱 로직 + } + } + state = AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED; + iwaterQuality.OnCompleted(); + } + catch (OperationCanceledException) + { + state = AQUA_DATA_CONTROL_STATE.CANCELLED; + iwaterQuality.OnCancelled(); + } + catch (Exception ex) + { + state = AQUA_DATA_CONTROL_STATE.ERROR; + iwaterQuality.OnError("파일 처리 중 오류 발생: " + ex.Message); + } + }); + } + /// + /// 처리 중단 요청 + /// + public void Cancel() + { + if (state == AQUA_DATA_CONTROL_STATE.PROCESSING && cts != null) + { + cts.Cancel(); + } + } } diff --git a/SmartAquaViewer/DataAnalisys/IWaterQuality.cs b/SmartAquaViewer/DataAnalisys/IWaterQuality.cs new file mode 100644 index 0000000..a76621e --- /dev/null +++ b/SmartAquaViewer/DataAnalisys/IWaterQuality.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SmartAquaViewer.DataAnalisys +{ + + internal enum AQUA_DATA_CONTROL_STATE + { + IDLE, + PROCESSING, + PROCESS_COMPLETED, + CANCELLED, + ERROR + } + + + internal interface IWaterQuality + { + void OnProgress(double percent); + void OnError(string message); + void OnCompleted(); + void OnCancelled(); + } +}