-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDeviceAppKeys.cs
116 lines (100 loc) · 2.83 KB
/
DeviceAppKeys.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using Newtonsoft.Json;
namespace HybridLab.Core
{
public class DeviceAppKeys
{
private readonly string _filePath;
private Dictionary<string, string> _dictionary;
private object _lock = new object();
/// <summary>
/// Created with Bing Chat
/// </summary>
/// <param name="filePath"></param>
public DeviceAppKeys(string filePath)
{
_filePath = filePath;
try
{
if (File.Exists(_filePath))
{
var json = File.ReadAllText(_filePath);
_dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
if (_dictionary == null)
{
_dictionary = new Dictionary<string, string>();
}
}
else
{
_dictionary = new Dictionary<string, string>();
}
}
catch (Exception)
{
_dictionary = new Dictionary<string, string>();
}
}
public async Task Set(string key, string value)
{
_dictionary[key] = value;
await SaveAsync();
}
public bool Contains(string key)
{
return _dictionary.ContainsKey(key);
}
public string Get(string key)
{
_dictionary.TryGetValue(key, out string value);
return value;
}
public async Task Remove(string key)
{
_dictionary.Remove(key);
await SaveAsync();
}
public async Task RemoveAll()
{
_dictionary.Clear();
await SaveAsync();
}
private async Task SaveAsync()
{
string json = JsonConvert.SerializeObject(_dictionary);
if (File.Exists(_filePath) == false)
{
lock (_lock)
{
File.WriteAllText(_filePath, json);
return;
}
}
lock (_lock)
{
while (IsFileLocked(new FileInfo(_filePath)))
{
Task.Delay(200);
}
File.WriteAllText(_filePath, json);
}
}
public static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
return true;
}
finally
{
if (stream != null)
stream.Close();
}
return false;
}
}
}