-
Notifications
You must be signed in to change notification settings - Fork 0
/
IniReader.cs
253 lines (226 loc) · 9.12 KB
/
IniReader.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
namespace ModBus
{
public class Ini
{
/// <summary>
/// Initializes a new instance of the <see cref="IniFile"/> class.
/// </summary>
/// <param name="file">The initialization file path.</param>
/// <param name="commentDelimiter">The comment delimiter string (default value is ";").
/// </param>
public Ini(string file)
{
TheFile = file;
}
/// <summary>
/// Initializes a new instance of the <see cref="IniFile"/> class.
/// </summary>
//public Ini()
//{
// CommentDelimiter = ";";
//}
/// <summary>
/// The comment delimiter string (default value is ";").
/// </summary>
//public string CommentDelimiter { get; set; }
private string theFile = null;
/// <summary>
/// The initialization file path.
/// </summary>
public string TheFile
{
get
{
return theFile;
}
set
{
theFile = null;
dictionary.Clear();
if (File.Exists(value))
{
theFile = value;
using StreamReader sr = new StreamReader(theFile);
string line, section = "";
while ((line = sr.ReadLine()) != null)
{
line = line.Trim();
if (line.Length == 0) continue; // empty line
//if (line.StartsWith(CommentDelimiter))
// continue; // comment
if (line.StartsWith("[") && line.Contains("]")) // [section]
{
int index = line.IndexOf(']');
section = line[1..index].Trim();
continue;
}
if (line.Contains("=")) // key=value
{
int index = line.IndexOf('=');
string key = line.Substring(0, index).Trim();
string val = line[(index + 1)..].Trim();
string key2 = String.Format("[{0}]{1}", section, key).ToLower();
if (val.StartsWith("\"") && val.EndsWith("\"")) // strip quotes
val = val[1..(val.Length - 2)];
if (dictionary.ContainsKey(key2)) // multiple values can share the same key
{
index = 1;
string key3;
while (true)
{
key3 = String.Format("{0}~{1}", key2, ++index);
if (!dictionary.ContainsKey(key3))
{
dictionary.Add(key3, val);
break;
}
}
}
else
{
dictionary.Add(key2, val);
}
}
}
}
}
}
// "[section]key" -> "value1"
// "[section]key~2" -> "value2"
// "[section]key~3" -> "value3"
private readonly Dictionary<string, string> dictionary = new Dictionary<string, string>();
private bool TryGetValue(string section, string key, out string value)
{
string key2;
if (section.StartsWith("["))
key2 = String.Format("{0}{1}", section, key);
else
key2 = String.Format("[{0}]{1}", section, key);
return dictionary.TryGetValue(key2.ToLower(), out value);
}
/// <summary>
/// Gets a string value by section and key.
/// </summary>
/// <param name="section">The section.</param>
/// <param name="key">The key.</param>
/// <param name="defaultValue">The default value.</param>
/// <returns>The value.</returns>
/// <seealso cref="GetAllValues"/>
public string GetValue(string section, string key, string defaultValue = "")
{
if (!TryGetValue(section, key, out string value))
return defaultValue;
return value;
}
/// <summary>
/// Gets a string value by section and key.
/// </summary>
/// <param name="section">The section.</param>
/// <param name="key">The key.</param>
/// <returns>The value.</returns>
/// <seealso cref="GetValue"/>
public string this[string section, string key]
{
get
{
return GetValue(section, key);
}
}
/// <summary>
/// Gets an integer value by section and key.
/// </summary>
/// <param name="section">The section.</param>
/// <param name="key">The key.</param>
/// <param name="defaultValue">The default value.</param>
/// <param name="minValue">Optional minimum value to be enforced.</param>
/// <param name="maxValue">Optional maximum value to be enforced.</param>
/// <returns>The value.</returns>
public int GetInteger(string section, string key, int defaultValue = 0,
int minValue = int.MinValue, int maxValue = int.MaxValue)
{
if (!TryGetValue(section, key, out string stringValue))
return defaultValue;
if (!int.TryParse(stringValue, out int value))
{
if (!double.TryParse(stringValue, out double dvalue))
return defaultValue;
value = (int)dvalue;
}
if (value < minValue)
value = minValue;
if (value > maxValue)
value = maxValue;
return value;
}
/// <summary>
/// Gets a double floating-point value by section and key.
/// </summary>
/// <param name="section">The section.</param>
/// <param name="key">The key.</param>
/// <param name="defaultValue">The default value.</param>
/// <param name="minValue">Optional minimum value to be enforced.</param>
/// <param name="maxValue">Optional maximum value to be enforced.</param>
/// <returns>The value.</returns>
//public double GetDouble(string section, string key, double defaultValue = 0,
// double minValue = double.MinValue, double maxValue = double.MaxValue)
//{
// string stringValue;
// if (!TryGetValue(section, key, out stringValue))
// return defaultValue;
// double value;
// if (!double.TryParse(stringValue, out value))
// return defaultValue;
// if (value < minValue)
// value = minValue;
// if (value > maxValue)
// value = maxValue;
// return value;
//}
/// <summary>
/// Gets a boolean value by section and key.
/// </summary>
/// <param name="section">The section.</param>
/// <param name="key">The key.</param>
/// <param name="defaultValue">The default value.</param>
/// <returns>The value.</returns>
public bool GetBoolean(string section, string key, bool defaultValue = false)
{
if (!TryGetValue(section, key, out string stringValue))
return defaultValue;
return (stringValue != "0" && !stringValue.StartsWith("f", true, null));
}
/// <summary>
/// Gets an array of string values by section and key.
/// </summary>
/// <param name="section">The section.</param>
/// <param name="key">The key.</param>
/// <returns>The array of values, or null if none found.</returns>
/// <seealso cref="GetValue"/>
//public string[] GetAllValues(string section, string key)
//{
// string key2, key3, value;
// if (section.StartsWith("["))
// key2 = String.Format("{0}{1}", section, key).ToLower();
// else
// key2 = String.Format("[{0}]{1}", section, key).ToLower();
// if (!dictionary.TryGetValue(key2, out value))
// return null;
// List<string> values = new List<string>();
// values.Add(value);
// int index = 1;
// while (true)
// {
// key3 = String.Format("{0}~{1}", key2, ++index);
// if (!dictionary.TryGetValue(key3, out value))
// break;
// values.Add(value);
// }
// return values.ToArray();
//}
}
}