file 처리 클래스 작성

hhsung_work
hhsung 10 months ago
parent c52758fc50
commit 8a9310397b

@ -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;
/// <summary>
/// 파일 파싱 시작
/// </summary>
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);
}
});
}
/// <summary>
/// 처리 중단 요청
/// </summary>
public void Cancel()
{
if (state == AQUA_DATA_CONTROL_STATE.PROCESSING && cts != null)
{
cts.Cancel();
}
}
}

@ -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();
}
}
Loading…
Cancel
Save