프로젝트

일반

사용자정보

통계
| 개정판:

root / HAgent / Horizon(TCP, HTTP) / Horizon / Ini.cs

이력 | 보기 | 이력해설 | 다운로드 (5.96 KB)

1
using System;
2
using System.Collections.Generic;
3
using System.IO;
4
using System.Linq;
5
using System.Text;
6

    
7
public class Ini
8
{
9
    Dictionary<string, Dictionary<string, string>> ini = new Dictionary<string, Dictionary<string, string>>(StringComparer.InvariantCultureIgnoreCase);
10
    string file;
11

    
12
    /// <summary>
13
    /// Initialize an INI file
14
    /// Load it if it exists
15
    /// </summary>
16
    /// <param name="file">Full path where the INI file has to be read from or written to</param>
17
    public Ini(string file)
18
    {
19
        this.file = file;
20

    
21
        if (!File.Exists(file))
22
            return;
23

    
24
        Load();
25
    }
26

    
27
    /// <summary>
28
    /// Load the INI file content
29
    /// </summary>
30
    public void Load()
31
    {
32
        var txt = File.ReadAllText(file);
33

    
34
        Dictionary<string, string> currentSection = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
35

    
36
        ini[""] = currentSection;
37

    
38
        foreach (var l in txt.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries)
39
                          .Select((t, i) => new
40
                          {
41
                              idx = i,
42
                              text = t.Trim()
43
                          }))
44
        // .Where(t => !string.IsNullOrWhiteSpace(t) && !t.StartsWith(";")))
45
        {
46
            var line = l.text;
47

    
48
            if (line.StartsWith(";") || string.IsNullOrWhiteSpace(line))
49
            {
50
                currentSection.Add(";" + l.idx.ToString(), line);
51
                continue;
52
            }
53

    
54
            if (line.StartsWith("[") && line.EndsWith("]"))
55
            {
56
                currentSection = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
57
                ini[line.Substring(1, line.Length - 2)] = currentSection;
58
                continue;
59
            }
60

    
61
            var idx = line.IndexOf("=");
62
            if (idx == -1)
63
                currentSection[line] = "";
64
            else
65
                currentSection[line.Substring(0, idx)] = line.Substring(idx + 1);
66
        }
67
    }
68

    
69
    /// <summary>
70
    /// Get a parameter value at the root level
71
    /// </summary>
72
    /// <param name="key">parameter key</param>
73
    /// <returns></returns>
74
    public string GetValue(string key)
75
    {
76
        return GetValue(key, "", "");
77
    }
78

    
79
    /// <summary>
80
    /// Get a parameter value in the section
81
    /// </summary>
82
    /// <param name="key">parameter key</param>
83
    /// <param name="section">section</param>
84
    /// <returns></returns>
85
    public string GetValue(string key, string section)
86
    {
87
        return GetValue(key, section, "");
88
    }
89

    
90
    /// <summary>
91
    /// Returns a parameter value in the section, with a default value if not found
92
    /// </summary>
93
    /// <param name="key">parameter key</param>
94
    /// <param name="section">section</param>
95
    /// <param name="default">default value</param>
96
    /// <returns></returns>
97
    public string GetValue(string key, string section, string @default)
98
    {
99
        if (!ini.ContainsKey(section))
100
            return @default;
101

    
102
        if (!ini[section].ContainsKey(key))
103
            return @default;
104

    
105
        return ini[section][key];
106
    }
107

    
108
    /// <summary>
109
    /// Save the INI file
110
    /// </summary>
111
    public void Save()
112
    {
113
        var sb = new StringBuilder();
114
        foreach (var section in ini)
115
        {
116
            if (section.Key != "")
117
            {
118
                sb.AppendFormat("[{0}]", section.Key);
119
                sb.AppendLine();
120
            }
121

    
122
            foreach (var keyValue in section.Value)
123
            {
124
                if (keyValue.Key.StartsWith(";"))
125
                {
126
                    sb.Append(keyValue.Value);
127
                    sb.AppendLine();
128
                }
129
                else
130
                {
131
                    sb.AppendFormat("{0}={1}", keyValue.Key, keyValue.Value);
132
                    sb.AppendLine();
133
                }
134
            }
135

    
136
            if (!endWithCRLF(sb))
137
                sb.AppendLine();
138
        }
139

    
140
        File.WriteAllText(file, sb.ToString());
141
    }
142

    
143
    bool endWithCRLF(StringBuilder sb)
144
    {
145
        if (sb.Length < 4)
146
            return sb[sb.Length - 2] == '\r' &&
147
                   sb[sb.Length - 1] == '\n';
148
        else
149
            return sb[sb.Length - 4] == '\r' &&
150
                   sb[sb.Length - 3] == '\n' &&
151
                   sb[sb.Length - 2] == '\r' &&
152
                   sb[sb.Length - 1] == '\n';
153
    }
154

    
155
    /// <summary>
156
    /// Write a parameter value at the root level
157
    /// </summary>
158
    /// <param name="key">parameter key</param>
159
    /// <param name="value">parameter value</param>
160
    public void WriteValue(string key, string value)
161
    {
162
        WriteValue(key, "", value);
163
    }
164

    
165
    /// <summary>
166
    /// Write a parameter value in a section
167
    /// </summary>
168
    /// <param name="key">parameter key</param>
169
    /// <param name="section">section</param>
170
    /// <param name="value">parameter value</param>
171
    public void WriteValue(string key, string section, string value)
172
    {
173
        Dictionary<string, string> currentSection;
174
        if (!ini.ContainsKey(section))
175
        {
176
            currentSection = new Dictionary<string, string>();
177
            ini.Add(section, currentSection);
178
        }
179
        else
180
            currentSection = ini[section];
181

    
182
        currentSection[key] = value;
183
    }
184

    
185
    /// <summary>
186
    /// Get all the keys names in a section
187
    /// </summary>
188
    /// <param name="section">section</param>
189
    /// <returns></returns>
190
    public string[] GetKeys(string section)
191
    {
192
        if (!ini.ContainsKey(section))
193
            return new string[0];
194

    
195
        return ini[section].Keys.ToArray();
196
    }
197

    
198
    /// <summary>
199
    /// Get all the section names of the INI file
200
    /// </summary>
201
    /// <returns></returns>
202
    public string[] GetSections()
203
    {
204
        return ini.Keys.Where(t => t != "").ToArray();
205
    }
206
}