using System.IO;
using System.Text.Json;
using PersonalToolBox.Models;
namespace PersonalToolBox.Services;
///
/// 基于 JSON 文件的数据持久化服务
/// 配置文件路径: 可执行程序目录/config.json
///
public class JsonDataService : IDataService
{
private readonly ILogService _logService;
private readonly string _filePath;
private static readonly JsonSerializerOptions JsonOptions = new()
{
WriteIndented = true,
PropertyNameCaseInsensitive = true
};
public AppConfig Config { get; private set; } = new();
public JsonDataService(ILogService logService)
{
_logService = logService;
_filePath = Path.Combine(AppContext.BaseDirectory, "config.json");
}
public void Load()
{
if (!File.Exists(_filePath))
{
_logService.Info("配置文件不存在,使用默认配置");
Config = new AppConfig();
Save();
return;
}
try
{
var json = File.ReadAllText(_filePath);
var config = JsonSerializer.Deserialize(json, JsonOptions);
if (config == null)
{
_logService.Warning("配置文件解析结果为空,使用默认配置");
Config = new AppConfig();
return;
}
Config = config;
// 核心容错逻辑:验证所有工具路径是否有效
foreach (var tool in Config.Tools)
{
if (string.IsNullOrWhiteSpace(tool.ExecutablePath))
continue;
// URL 格式的路径(如 https://...)不需要检查本地文件是否存在
if (Uri.TryCreate(tool.ExecutablePath, UriKind.Absolute, out var uri) &&
(uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps))
{
tool.IsValid = true;
continue;
}
// 纯文件名(无路径分隔符)可能位于系统 PATH 中,不标记为失效
if (!tool.ExecutablePath.Contains('\\') && !tool.ExecutablePath.Contains('/'))
{
tool.IsValid = true;
continue;
}
if (!File.Exists(tool.ExecutablePath))
{
tool.IsValid = false;
_logService.Warning($"工具 \"{tool.Name}\" 路径失效,找不到文件: {tool.ExecutablePath}");
}
else
{
tool.IsValid = true;
}
}
_logService.Info($"配置加载完成: {Config.Categories.Count} 个分类, {Config.Tools.Count} 个工具");
}
catch (JsonException ex)
{
_logService.Error($"配置文件 JSON 解析失败: {ex.Message}");
Config = new AppConfig();
}
catch (Exception ex)
{
_logService.Error($"配置文件加载失败: {ex.Message}");
Config = new AppConfig();
}
}
public void Save()
{
try
{
var json = JsonSerializer.Serialize(Config, JsonOptions);
File.WriteAllText(_filePath, json);
_logService.Info("配置已保存");
}
catch (Exception ex)
{
_logService.Error($"配置保存失败: {ex.Message}");
}
}
}