using System;
using System.IO;
namespace Housing.Services
{
///
/// Setting.ini (또는 Database.ini) 파일에서 바코드 관련 설정(BarcodeMapping)을 관리하는 클래스.
///
public class BarcodeSettings
{
///
/// 바코드 매핑 필수 여부.
/// true : 바코드 매핑 실패 시 검사 중단 (NG 처리)
/// false: 바코드 매핑 안 되어도 검사 계속 진행 (더미 데이터 생성 안함)
///
public bool BarcodeMapping { get; set; } = true;
private static readonly object _barcodeLock = new object();
private static BarcodeSettings _cachedSettings;
private static DateTime _lastWriteTime;
private static string _cachedPath;
public static string GetDefaultFilePath()
{
string folder = AppDomain.CurrentDomain.BaseDirectory;
if (!Directory.Exists(folder))
{
Directory.CreateDirectory(folder);
}
string settingIni = Path.Combine(folder, "Setting.ini");
if (File.Exists(settingIni)) return settingIni;
string lowerSettingIni = Path.Combine(folder, "setting.ini");
if (File.Exists(lowerSettingIni)) return lowerSettingIni;
return settingIni;
}
public static BarcodeSettings Load(string path = null)
{
if (string.IsNullOrEmpty(path))
{
path = GetDefaultFilePath();
}
lock (_barcodeLock)
{
try
{
if (File.Exists(path))
{
var currentWriteTime = File.GetLastWriteTime(path);
if (_cachedSettings != null && _cachedPath == path && _lastWriteTime == currentWriteTime)
{
return _cachedSettings;
}
var settings = new BarcodeSettings();
var lines = File.ReadAllLines(path);
foreach (var line in lines)
{
var trimmed = line.Trim();
if (trimmed.StartsWith(";") || trimmed.StartsWith("#")) continue;
if (trimmed.StartsWith("BarcodeMapping", StringComparison.OrdinalIgnoreCase))
{
var parts = trimmed.Split(new[] { '=' }, 2);
if (parts.Length == 2)
{
if (bool.TryParse(parts[1].Trim(), out var val))
{
settings.BarcodeMapping = val;
}
else if (int.TryParse(parts[1].Trim(), out var intVal))
{
settings.BarcodeMapping = intVal != 0;
}
}
}
}
_cachedSettings = settings;
_lastWriteTime = currentWriteTime;
_cachedPath = path;
return settings;
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[BarcodeSettings Load Error] {ex.Message}");
}
// 파일이 없을 경우 Setting.ini 자동 생성
EnsureDefaultFile(path);
return _cachedSettings ?? new BarcodeSettings();
}
}
public static void Save(BarcodeSettings settings, string path = null)
{
if (string.IsNullOrEmpty(path))
{
path = GetDefaultFilePath();
}
lock (_barcodeLock)
{
try
{
string dir = Path.GetDirectoryName(path);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
using (var writer = new StreamWriter(path, false, System.Text.Encoding.UTF8))
{
writer.WriteLine("; =====================================================================");
writer.WriteLine("; Leak Test System - 환경 및 바코드 설정 파일 (Setting.ini)");
writer.WriteLine("; =====================================================================");
writer.WriteLine();
writer.WriteLine("[Barcode]");
writer.WriteLine("; BarcodeMapping: 바코드 매핑 필수 여부 (true = 매핑 미될 시 검사 중단, false = 매핑 없어도 검사 진행)");
writer.WriteLine($"BarcodeMapping={(settings.BarcodeMapping ? "true" : "false")}");
}
_cachedSettings = settings;
_cachedPath = path;
_lastWriteTime = File.GetLastWriteTime(path);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[BarcodeSettings Save Error] {ex.Message}");
}
}
}
public static void EnsureDefaultFile(string path)
{
try
{
if (!File.Exists(path))
{
string dir = Path.GetDirectoryName(path);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
using (var writer = new StreamWriter(path, false, System.Text.Encoding.UTF8))
{
writer.WriteLine("; =====================================================================");
writer.WriteLine("; Leak Test System - 환경 및 바코드 설정 파일 (Setting.ini)");
writer.WriteLine("; =====================================================================");
writer.WriteLine();
writer.WriteLine("[Barcode]");
writer.WriteLine("; BarcodeMapping: 바코드 매핑 필수 여부 (true = 매핑 미될 시 검사 중단, false = 매핑 없어도 검사 진행)");
writer.WriteLine("BarcodeMapping=true");
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[BarcodeSettings EnsureDefaultFile Error] {ex.Message}");
}
}
}
}