LenovoLegionToolkit
77 строк · 2.2 Кб
1using System;
2using System.IO;
3using LenovoLegionToolkit.Lib.Utils;
4using Newtonsoft.Json;
5using Newtonsoft.Json.Converters;
6
7namespace LenovoLegionToolkit.Lib.Settings;
8
9public abstract class AbstractSettings<T> where T : class, new()
10{
11protected readonly JsonSerializerSettings JsonSerializerSettings;
12private readonly string _settingsStorePath;
13private readonly string _fileName;
14
15protected virtual T Default => new();
16
17public T Store => _store ??= LoadStore() ?? Default;
18
19private T? _store;
20
21protected AbstractSettings(string filename)
22{
23JsonSerializerSettings = new()
24{
25Formatting = Formatting.Indented,
26TypeNameHandling = TypeNameHandling.Auto,
27ObjectCreationHandling = ObjectCreationHandling.Replace,
28Converters = { new StringEnumConverter() }
29};
30
31_fileName = filename;
32_settingsStorePath = Path.Combine(Folders.AppData, _fileName);
33}
34
35public void SynchronizeStore()
36{
37var settingsSerialized = JsonConvert.SerializeObject(_store, JsonSerializerSettings);
38File.WriteAllText(_settingsStorePath, settingsSerialized);
39}
40
41public virtual T? LoadStore()
42{
43T? store = null;
44try
45{
46var settingsSerialized = File.ReadAllText(_settingsStorePath);
47store = JsonConvert.DeserializeObject<T>(settingsSerialized, JsonSerializerSettings);
48
49if (store is null)
50TryBackup();
51}
52catch
53{
54TryBackup();
55}
56
57return store;
58}
59
60private void TryBackup()
61{
62try
63{
64if (!File.Exists(_settingsStorePath))
65return;
66
67var backupFileName = $"{Path.GetFileNameWithoutExtension(_fileName)}_backup_{DateTime.UtcNow:yyyyMMddHHmmss}{Path.GetExtension(_fileName)}";
68var backupFilePath = Path.Combine(Folders.AppData, backupFileName);
69File.Copy(_settingsStorePath, backupFilePath);
70}
71catch (Exception ex)
72{
73if (Log.Instance.IsTraceEnabled)
74Log.Instance.Trace($"Unable to create backup for {_fileName}", ex);
75}
76}
77}
78