LenovoLegionToolkit

Форк
0
77 строк · 2.2 Кб
1
using System;
2
using System.IO;
3
using LenovoLegionToolkit.Lib.Utils;
4
using Newtonsoft.Json;
5
using Newtonsoft.Json.Converters;
6

7
namespace LenovoLegionToolkit.Lib.Settings;
8

9
public abstract class AbstractSettings<T> where T : class, new()
10
{
11
    protected readonly JsonSerializerSettings JsonSerializerSettings;
12
    private readonly string _settingsStorePath;
13
    private readonly string _fileName;
14

15
    protected virtual T Default => new();
16

17
    public T Store => _store ??= LoadStore() ?? Default;
18

19
    private T? _store;
20

21
    protected AbstractSettings(string filename)
22
    {
23
        JsonSerializerSettings = new()
24
        {
25
            Formatting = Formatting.Indented,
26
            TypeNameHandling = TypeNameHandling.Auto,
27
            ObjectCreationHandling = ObjectCreationHandling.Replace,
28
            Converters = { new StringEnumConverter() }
29
        };
30

31
        _fileName = filename;
32
        _settingsStorePath = Path.Combine(Folders.AppData, _fileName);
33
    }
34

35
    public void SynchronizeStore()
36
    {
37
        var settingsSerialized = JsonConvert.SerializeObject(_store, JsonSerializerSettings);
38
        File.WriteAllText(_settingsStorePath, settingsSerialized);
39
    }
40

41
    public virtual T? LoadStore()
42
    {
43
        T? store = null;
44
        try
45
        {
46
            var settingsSerialized = File.ReadAllText(_settingsStorePath);
47
            store = JsonConvert.DeserializeObject<T>(settingsSerialized, JsonSerializerSettings);
48

49
            if (store is null)
50
                TryBackup();
51
        }
52
        catch
53
        {
54
            TryBackup();
55
        }
56

57
        return store;
58
    }
59

60
    private void TryBackup()
61
    {
62
        try
63
        {
64
            if (!File.Exists(_settingsStorePath))
65
                return;
66

67
            var backupFileName = $"{Path.GetFileNameWithoutExtension(_fileName)}_backup_{DateTime.UtcNow:yyyyMMddHHmmss}{Path.GetExtension(_fileName)}";
68
            var backupFilePath = Path.Combine(Folders.AppData, backupFileName);
69
            File.Copy(_settingsStorePath, backupFilePath);
70
        }
71
        catch (Exception ex)
72
        {
73
            if (Log.Instance.IsTraceEnabled)
74
                Log.Instance.Trace($"Unable to create backup for {_fileName}", ex);
75
        }
76
    }
77
}
78

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.