using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace DrillTools
{
///
/// 二钻涨缩系数的 ini 持久化存储。
/// 存放于 %LocalAppData%\DrillTools\scaling.ini,UTF-8 无 BOM,
/// 只保留最近一次涨缩记录(模式 + 输入值 + 源文件名)。
///
internal static class ScalingProfileStore
{
private const string SectionName = "LastScaling";
private const string KeyMode = "Mode";
private const string KeyInputX = "InputX";
private const string KeyInputY = "InputY";
private const string KeyFileName = "FileName";
///
/// ini 配置文件完整路径:%LocalAppData%\DrillTools\scaling.ini
///
private static string GetIniPath()
{
string dir = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"DrillTools");
return Path.Combine(dir, "scaling.ini");
}
///
/// 读取上次涨缩记录。
/// 文件不存在或缺少必需键(含模式无法解析)时返回 null;其它 IO 异常向上抛出,由调用边界处理。
///
public static ScalingRecord? Load()
{
string path = GetIniPath();
if (!File.Exists(path))
return null;
// 简易 ini 解析:按 [section] 切节,仅在目标节内收集 key=value
var values = new Dictionary(StringComparer.OrdinalIgnoreCase);
bool inSection = false;
foreach (var raw in File.ReadAllLines(path))
{
string line = raw.Trim();
if (line.Length == 0 || line.StartsWith(";"))
continue;
// 节标题
if (line.StartsWith("[") && line.EndsWith("]"))
{
inSection = line.Equals($"[{SectionName}]", StringComparison.OrdinalIgnoreCase);
continue;
}
if (!inSection)
continue;
int eq = line.IndexOf('=');
if (eq <= 0)
continue;
string key = line.Substring(0, eq).Trim();
string val = line.Substring(eq + 1).Trim();
values[key] = val;
}
// 必需键校验:缺任一或模式无法解析视为无有效记录(容错损坏)
if (!values.TryGetValue(KeyMode, out string? modeStr) ||
!values.TryGetValue(KeyInputX, out string? inputX) ||
!values.TryGetValue(KeyInputY, out string? inputY))
return null;
if (!Enum.TryParse(modeStr, out ScalingMode mode))
return null;
// 文件名为可选追溯字段
values.TryGetValue(KeyFileName, out string? fileName);
return new ScalingRecord(mode, inputX, inputY, fileName);
}
///
/// 写入涨缩记录,整体覆盖。自动创建目录。失败时抛出异常,由调用边界处理。
///
public static void Save(ScalingMode mode, string inputX, string inputY, string fileName)
{
string path = GetIniPath();
string? dir = Path.GetDirectoryName(path);
if (!string.IsNullOrEmpty(dir))
Directory.CreateDirectory(dir);
var content =
$"[{SectionName}]\r\n" +
$"{KeyMode}={mode}\r\n" +
$"{KeyInputX}={inputX}\r\n" +
$"{KeyInputY}={inputY}\r\n" +
$"{KeyFileName}={fileName}\r\n";
// UTF-8 无 BOM(项目文件编码规范)
File.WriteAllText(path, content, new UTF8Encoding(false));
}
}
///
/// 涨缩系数持久化记录(只读)。
///
internal sealed class ScalingRecord
{
public ScalingMode Mode { get; }
public string InputX { get; }
public string InputY { get; }
public string? FileName { get; }
public ScalingRecord(ScalingMode mode, string inputX, string inputY, string? fileName)
{
Mode = mode;
InputX = inputX;
InputY = inputY;
FileName = fileName;
}
}
}