1
using System;
2
using System.IO;
3
using System.Data;
4
using System.Runtime.InteropServices;
5
using System.Text;
6
using System.Collections;
7
using System.Collections.Specialized;
8
9
namespace FaibClass.IniFile
10
{
11
/// <summary>
12
/// INI配置文件管理库,
13
/// Design By Faib Studio.
14
/// </summary>
15
public class IniFile
16
{
17
18
internal static string _FileName;
19
private SectionCollection _Sections=new SectionCollection();
20
21
/// <summary>
22
/// 构造类。
23
/// </summary>
24
public IniFile()
25
{
26
}
27
28
/// <summary>
29
/// INI文件名。
30
/// </summary>
31
public string FileName
32
{
33
get{return _FileName;}
34
set{_FileName=value;this.LoadDataStructure();}
35
}
36
37
/// <summary>
38
/// 构造类,传入文件名。
39
/// </summary>
40
/// <param name="FileName">INI文件名。</param>
41
public IniFile(string FileName)
42
{
43
_FileName=FileName;
44
LoadDataStructure();
45
}
46
47
/// <summary>
48
/// 返回版权信息。
49
/// </summary>
50
public string CopyrightMessage
51
{
52
get{return "Copyright (C) 2006 Faib Studio All Rights Reserved";}
53
}
54
55
/// <summary>
56
/// 读取键值。
57
/// </summary>
58
/// <param name="Section">节名称。</param>
59
/// <param name="Key">键名称</param>
60
/// <returns>键值。</returns>
61
public string ReadValue(string Section,string Key)
62
{
63
if(_FileName==null || _FileName=="")return null;
64
return IniFile.ReadValue(_FileName,Section,Key);
65
}
66
67
/// <summary>
68
/// 读取键值。
69
/// </summary>
70
/// <param name="FileName">文件路径。</param>
71
/// <param name="Section">节名称。</param>
72
/// <param name="Key">键名称</param>
73
/// <returns>键值。</returns>
74
public static string ReadValue(string FileName,string Section,string Key)
75
{
76
byte[] temp=new byte[255];
77
try
78
{
79
int l = WindowsAPI.GetPrivateProfileString(Section,Key,"",temp, temp.GetUpperBound(0) ,FileName);
80
string ret = Encoding.GetEncoding(0).GetString(temp);
81
return ret.Substring(0,ret.IndexOf((char)0));
82
}
83
catch
84
{
85
throw;
86
}
87
}
88
89
/// <summary>
90
/// 写入键值。
91
/// </summary>
92
/// <param name="Section">节名称。</param>
93
/// <param name="Key">键名称。</param>
94
/// <param name="Value">键值。</param>
95
public void WriteValue(string Section,string Key,object Value)
96
{
97
if(_FileName==null || _FileName=="")return;
98
IniFile.WriteValue(_FileName,Section,Key,Value);
99
this.LoadDataStructure();
100
}
101
102
/// <summary>
103
/// 写入键值。
104
/// </summary>
105
/// <param name="FileName">文件路径。</param>
106
/// <param name="Section">节名称。</param>
107
/// <param name="Key">键名称。</param>
108
/// <param name="Value">键值。</param>
109
public static void WriteValue(string FileName,string Section,string Key,object Value)
110
{
111
WindowsAPI.WritePrivateProfileString(Section,Key,Value.ToString(),FileName);
112
}
113
114
/// <summary>
115
/// 移除节。
116
/// </summary>
117
/// <param name="Section">节名称。</param></param>
118
public void RemoveSection(string Section)
119
{
120
if(_FileName==null || _FileName=="")return;
121
IniFile.RemoveSection(_FileName,Section);
122
this.LoadDataStructure();
123
}
124
125
/// <summary>
126
/// 移除节。
127
/// </summary>
128
/// <param name="FileName">文件路径。</param>
129
/// <param name="Section">节名称。</param>
130
public static void RemoveSection(string FileName,string Section)
131
{
132
WindowsAPI.WritePrivateProfileString(Section, null, null, FileName);
133
}
134
135
/// <summary>
136
/// 移除键值。
137
/// </summary>
138
/// <param name="Section">节名称。</param>
139
/// <param name="Key">键名称。</param>
140
public void RemoveKey(string Section,string Key)
141
{
142
if(_FileName==null || _FileName=="")return;
143
IniFile.RemoveKey(_FileName,Section,Key);
144
this.LoadDataStructure();
145
}
146
147
/// <summary>
148
/// 移除键值。
149
/// </summary>
150
/// <param name="FileName">文件路径。</param>
151
/// <param name="Section">节名称。</param>
152
/// <param name="Key">键名称。</param>
153
public static void RemoveKey(string FileName,string Section,string Key)
154
{
155
WindowsAPI.WritePrivateProfileString(Section, Key, null, FileName);
156
}
157
158
/// <summary>
159
/// 返回节集合。
160
/// </summary>
161
public SectionCollection Sections
162
{
163
get{return _Sections;}
164
}
165
166
/// <summary>
167
/// 获取文件详细信息对象。
168
/// </summary>
169
public FileInfo FileInfo
170
{
171
get{return new FileInfo(_FileName);}
172
}
173
174
/// <summary>
175
/// 将配置写入到DataSet中。
176
/// </summary>
177
/// <returns></returns>
178
public DataSet WriteDataSet()
179
{
180
DataSet ret=new DataSet();
181
foreach(Section s in this.Sections)
182
{
183
DataTable tb=ret.Tables.Add(s.SectionName);
184
tb.Columns.Add("Key");
185
tb.Columns.Add("Value");
186
foreach(Key k in s.Keys)
187
tb.Rows.Add(new string[]{k.KeyName,k.Value});
188
}
189
return ret;
190
}
191
192
//加载INI配置文件
193
private void LoadDataStructure()
194
{
195
if(_FileName==null || _FileName=="")return;
196
_Sections.Clear(true);
197
try
198
{
199
byte[] temp1=new byte[32767];
200
byte[] temp2=new byte[32767];
201
string ret1="",ret2="";
202
//获取所有节
203
int l1=WindowsAPI.GetPrivateProfileString(null, null, null,temp1, temp1.GetUpperBound(0), _FileName);
204
ret1=Encoding.GetEncoding(0).GetString(temp1);
205
ret1.Substring(0,ret1.IndexOf((char)0));
206
string[] s1=FormChar(ret1);
207
for(int i=0;i<s1.Length;i++)
208
{
209
if(s1[i].Trim()!="")
210
{
211
Section section=_Sections.Add(s1[i],true);
212
section.Keys.SetOwner(section);
213
//获取所有键
214
int l2=WindowsAPI.GetPrivateProfileSection(s1[i],temp2,temp2.GetUpperBound(0),_FileName);
215
ret2=Encoding.GetEncoding(0).GetString(temp2).Substring(0,l2);
216
string[] s2=FormChar(ret2);
217
for(int j=0;j<s2.Length;j++)
218
{
219
int pp=s2[j].IndexOf("=");
220
if(pp>0)
221
{
222
if(s2[j].Trim()!="")
223
{
224
string k1=s2[j].Substring(0,pp).Trim();
225
string k2=s2[j].Substring(pp+1,s2[j].Length-pp-1);
226
Key key=section.Keys.Add(k1,k2,true);
227
key.SetOwner(section);
228
}
229
}
230
}
231
}
232
}
233
}
234
catch(Exception ex)
235
{
236
throw new Exception(ex.Message);
237
}
238
}
239
240
private static string[] FormChar(string s)
241
{
242
ArrayList ret=new ArrayList();
243
string[] ret1;
244
int pos=0;
245
while(true)
246
{
247
int p1=pos;
248
pos=s.IndexOf((char)0,pos);
249
if(pos<=0)break;
250
string s1=s.Substring(p1,pos-p1);
251
ret.Add(s1);
252
pos+=1;
253
}
254
ret1=new string[ret.Count];
255
for(int i=0;i<ret.Count;i++)
256
ret1[i]=(string)ret[i];
257
return ret1;
258
}
259
260
private static string[] FormChar(string s,bool trim)
261
{
262
ArrayList ret=new ArrayList();
263
string[] ret1;
264
int pos=0;
265
while(true)
266
{
267
int p1=pos;
268
pos=s.IndexOf((char)0,pos);
269
if(pos<=0)break;
270
271
string s1=s.Substring(p1,pos-p1);
272
ret.Add(s1);
273
pos+=1;
274
}
275
ret1=new string[ret.Count];
276
for(int i=0;i<ret.Count;i++)
277
ret1[i]=(string)ret[i];
278
return ret1;
279
}
280
}
281
282
/// <summary>
283
/// 节配置集合类。
284
/// </summary>
285
public class SectionCollection:IEnumerable
286
{
287
private ArrayList _Section=new ArrayList();
288
289
/// <summary>
290
/// 配置节的数量。
291
/// </summary>
292
public int Count
293
{
294
get{return _Section.Count;}
295
}
296
297
/// <summary>
298
/// 返回指定位置处的节对象。
299
/// </summary>
300
public Section this[int Index]
301
{
302
get{return (Section)_Section[Index];}
303
}
304
305
/// <summary>
306
/// 返回指定节名称的节对象。
307
/// </summary>
308
public Section this[string SectionName]
309
{
310
get
311
{
312
Section ret=new Section();
313
for(int i=0;i<_Section.Count;i++)
314
{
315
Section v=(Section)_Section[i];
316
if(v.SectionName.ToLower()==SectionName.ToLower())
317
{
318
ret=v;
319
break;
320
}
321
}
322
return ret;
323
}
324
}
325
326
//内部添加。
327
internal Section Add(string SectionName,bool inter)
328
{
329
Section ret=new Section(SectionName);
330
_Section.Add(ret);
331
return ret;
332
}
333
334
//内部添加。
335
internal Section Add(Section Object,bool inter)
336
{
337
_Section.Add(Object);
338
return Object;
339
}
340
341
//内部清除。
342
internal void Clear(bool inter)
343
{
344
_Section.Clear();
345
}
346
347
internal void Remove(int Index,bool inter)
348
{
349
_Section.Remove(_Section[Index]);
350
}
351
352
/// <summary>
353
/// 添加配置节对象。
354
/// </summary>
355
/// <param name="SectionName">节名称。</param>
356
/// <returns></returns>
357
public Section Add(string SectionName)
358
{
359
Section ret=new Section(SectionName);
360
ret.Keys.SetOwner(ret);
361
WindowsAPI.WritePrivateProfileSection(SectionName, new byte[0], IniFile._FileName);
362
_Section.Add(ret);
363
return ret;
364
}
365
366
/// <summary>
367
/// 清除INI文件中的所有节。
368
/// </summary>
369
public void Clear()
370
{
371
for(int i=_Section.Count-1;i>=0;i--)
372
this.Remove(i);
373
}
374
375
/// <summary>
376
/// 从集合中移除节。
377
/// </summary>
378
/// <param name="Index">节的索引位置。</param>
379
public void Remove(int Index)
380
{
381
Section ret=(Section)_Section[Index];
382
WindowsAPI.WritePrivateProfileString(ret.SectionName, null, null, IniFile._FileName);
383
_Section.Remove(ret);
384
}
385
386
/// <summary>
387
/// 从集合中移除节。
388
/// </summary>
389
/// <param name="SectionName">节的名称。</param>
390
public void Remove(string SectionName)
391
{
392
Section ret=null;
393
for(int i=0;i<_Section.Count;i++)
394
{
395
Section v=(Section)_Section[i];
396
if(v.SectionName.ToLower()==SectionName.ToLower())
397
{
398
ret=v;
399
break;
400
}
401
}
402
if(ret==null)return;
403
WindowsAPI.WritePrivateProfileString(ret.SectionName, null, null, IniFile._FileName);
404
_Section.Remove(ret);
405
}
406
407
/// <summary>
408
/// 检测指定的节是否包含在此集合中。
409
/// </summary>
410
/// <param name="SectionName">节名称。</param>
411
/// <returns></returns>
412
public bool Contains(string SectionName)
413
{
414
foreach(Section s in this)
415
if(s.SectionName.ToLower()==SectionName.ToLower())
416
return true;
417
return false;
418
}
419
420
IEnumerator IEnumerable.GetEnumerator()
421
{
422
return new Section(this);
423
}
424
}
425
426
/// <summary>
427
/// 节配置类。
428
/// </summary>
429
public class Section:IEnumerator
430
{
431
private int nIndex;
432
SectionCollection enu;
433
private string _SectionName="";
434
private KeyCollection _Keys=new KeyCollection();
435
436
public Section()
437
{
438
}
439
440
internal Section(SectionCollection sc)
441
{
442
enu=sc;
443
nIndex=-1;
444
}
445
446
/// <summary>
447
/// 构造类。
448
/// </summary>
449
/// <param name="SectionName">节名称。</param>
450
public Section(string SectionName)
451
{
452
_SectionName=SectionName;
453
}
454
455
/// <summary>
456
/// 返回此节中的所有键。
457
/// </summary>
458
public KeyCollection Keys
459
{
460
get{return _Keys;}
461
}
462
463
/// <summary>
464
/// 返回此节中的指定位置的键。
465
/// </summary>
466
public Key this[int Index]
467
{
468
get{return _Keys[Index];}
469
}
470
471
/// <summary>
472
/// 返回节名称。
473
/// </summary>
474
public string SectionName
475
{
476
get{return _SectionName;}
477
set{_SectionName=value;}
478
}
479
480
/// <summary>
481
/// 清除此节下的所有键。
482
/// </summary>
483
public void Clear()
484
{
485
WindowsAPI.WritePrivateProfileSection(_SectionName, new byte[0], IniFile._FileName);
486
_Keys.Clear();
487
}
488
489
/// <summary>
490
/// 移除此节。
491
/// </summary>
492
public void Remove()
493
{
494
WindowsAPI.WritePrivateProfileString(_SectionName, null, null, IniFile._FileName);
495
}
496
497
void IEnumerator.Reset()
498
{
499
nIndex=-1;
500
}
501
502
object IEnumerator.Current
503
{
504
get{return enu[nIndex];}
505
}
506
507
bool IEnumerator.MoveNext()
508
{
509
nIndex++;
510
return(nIndex < enu.Count);
511
}
512
}
513
514
/// <summary>
515
/// 键集合类。
516
/// </summary>
517
public class KeyCollection:IEnumerable
518
{
519
private ArrayList _Key=new ArrayList();
520
private Section _Owner;
521
522
/// <summary>
523
/// 返回键数量。
524
/// </summary>
525
public int Count
526
{
527
get{return _Key.Count;}
528
}
529
530
internal void SetOwner(Section v)
531
{
532
_Owner=v;
533
}
534
535
/// <summary>
536
/// 返回指定位置的键。
537
/// </summary>
538
public Key this[int Index]
539
{
540
get
541
{
542
return (Key)_Key[Index];
543
}
544
}
545
546
/// <summary>
547
/// 返回指定名称的键。
548
/// </summary>
549
public Key this[string KeyName]
550
{
551
get
552
{
553
Key ret=new Key();
554
for(int i=0;i<_Key.Count;i++)
555
{
556
Key v=(Key)_Key[i];
557
if(v.KeyName.ToLower()==KeyName.ToLower())
558
{
559
ret=v;
560
break;
561
}
562
}
563
return ret;
564
}
565
}
566
567
//内部添加
568
internal Key Add(string KeyName,string Value,bool inter)
569
{
570
Key ret=new Key(KeyName,Value);
571
_Key.Add(ret);
572
return ret;
573
574
}
575
576
//内部清除
577
internal void Clear(bool inter)
578
{
579
_Key.Clear();
580
}
581
582
//移除
583
internal void Remove(int Index,bool inter)
584
{
585
_Key.Remove(_Key[Index]);
586
}
587
588
/// <summary>
589
/// 添加配置键对象。
590
/// </summary>
591
/// <param name="KeyName">键名称。</param>
592
/// <param name="Value">键值。</param>
593
/// <returns></returns>
594
public Key Add(string KeyName,string Value)
595
{
596
Key ret=new Key(KeyName,Value);
597
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, KeyName, Value, IniFile._FileName);
598
_Key.Add(ret);
599
return ret;
600
}
601
602
/// <summary>
603
/// 清除INI文件中的所有节。
604
/// </summary>
605
public void Clear()
606
{
607
for(int i=_Key.Count-1;i>=0;i--)
608
this.Remove(i);
609
}
610
611
/// <summary>
612
/// 从集合中移除节。
613
/// </summary>
614
/// <param name="Index">节的索引位置。</param>
615
public void Remove(int Index)
616
{
617
Key ret=(Key)_Key[Index];
618
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, ret.KeyName, null, IniFile._FileName);
619
_Key.Remove(ret);
620
}
621
622
/// <summary>
623
/// 从集合中移除节。
624
/// </summary>
625
/// <param name="KeyName">节的名称。</param>
626
public void Remove(string KeyName)
627
{
628
Key ret=null;
629
for(int i=0;i<_Key.Count;i++)
630
{
631
Key v=(Key)_Key[i];
632
if(v.KeyName.ToLower()==KeyName.ToLower())
633
{
634
ret=v;
635
break;
636
}
637
}
638
if(ret==null)return;
639
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, ret.KeyName, null, IniFile._FileName);
640
_Key.Remove(ret);
641
}
642
643
/// <summary>
644
/// 检测指定的键是否包含在此集合中。
645
/// </summary>
646
/// <param name="KeyName">键名称。</param>
647
/// <returns></returns>
648
public bool Contains(string KeyName)
649
{
650
foreach(Key k in this)
651
if(k.KeyName.ToLower()==KeyName.ToLower())
652
return true;
653
return false;
654
}
655
656
IEnumerator IEnumerable.GetEnumerator()
657
{
658
return new Key(this);
659
}
660
}
661
662
/// <summary>
663
/// 键类。
664
/// </summary>
665
public class Key:IEnumerator
666
{
667
private int nIndex;
668
KeyCollection enu;
669
private string _KeyName="";
670
private string _Value="";
671
private Section _Owner;
672
673
public Key()
674
{
675
}
676
677
internal Key(KeyCollection kc)
678
{
679
enu=kc;
680
nIndex=-1;
681
}
682
683
/// <summary>
684
/// 构造类。
685
/// </summary>
686
/// <param name="KeyName">键名称。</param>
687
/// <param name="Value">键值。</param>
688
public Key(string KeyName,string Value)
689
{
690
_KeyName=KeyName;
691
_Value=Value;
692
}
693
694
internal void SetOwner(Section v)
695
{
696
_Owner=v;
697
}
698
699
/// <summary>
700
/// 返回键名称。
701
/// </summary>
702
public string KeyName
703
{
704
get{return _KeyName;}
705
set{_KeyName=value;}
706
}
707
708
/// <summary>
709
/// 设置或返回键值。
710
/// </summary>
711
public string Value
712
{
713
get{return _Value;}
714
set{
715
_Value=value;
716
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, _KeyName, _Value, IniFile._FileName);
717
}
718
}
719
720
/// <summary>
721
/// 移除此键。
722
/// </summary>
723
public void Remove()
724
{
725
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, _KeyName, null, IniFile._FileName);
726
}
727
728
void IEnumerator.Reset()
729
{
730
nIndex=-1;
731
}
732
733
object IEnumerator.Current
734
{
735
get{return enu[nIndex];}
736
}
737
738
bool IEnumerator.MoveNext()
739
{
740
nIndex++;
741
return(nIndex < enu.Count);
742
}
743
}
744
745
internal class WindowsAPI
746
{
747
[DllImport("kernel32", EntryPoint="GetPrivateProfileSectionA")]
748
internal static extern int GetPrivateProfileSection(string lpAppName,byte[] lpReturnedString,int nSize,string filePath);
749
750
[DllImport("kernel32", EntryPoint="GetPrivateProfileStringA")]
751
internal static extern int GetPrivateProfileString(string section,string key,string def, byte[] retVal,int size,string filePath);
752
753
[DllImport("kernel32.dll")]
754
internal extern static int WritePrivateProfileSection(string segName,byte [] sData,string fileName);
755
756
[DllImport("kernel32", EntryPoint="WritePrivateProfileStringA")]
757
internal static extern int WritePrivateProfileString(string section,string key,string val,string filePath);
758
759
}
760
761
}
using System;2
using System.IO;3
using System.Data;4
using System.Runtime.InteropServices;5
using System.Text;6
using System.Collections;7
using System.Collections.Specialized;8

9
namespace FaibClass.IniFile10
{11
/// <summary>12
/// INI配置文件管理库,13
/// Design By Faib Studio.14
/// </summary>15
public class IniFile16
{17
18
internal static string _FileName;19
private SectionCollection _Sections=new SectionCollection();20

21
/// <summary>22
/// 构造类。23
/// </summary>24
public IniFile()25
{26
}27

28
/// <summary>29
/// INI文件名。30
/// </summary>31
public string FileName32
{33
get{return _FileName;}34
set{_FileName=value;this.LoadDataStructure();}35
}36

37
/// <summary>38
/// 构造类,传入文件名。39
/// </summary>40
/// <param name="FileName">INI文件名。</param>41
public IniFile(string FileName)42
{43
_FileName=FileName;44
LoadDataStructure();45
}46

47
/// <summary>48
/// 返回版权信息。49
/// </summary>50
public string CopyrightMessage51
{52
get{return "Copyright (C) 2006 Faib Studio All Rights Reserved";}53
}54

55
/// <summary>56
/// 读取键值。57
/// </summary>58
/// <param name="Section">节名称。</param>59
/// <param name="Key">键名称</param>60
/// <returns>键值。</returns>61
public string ReadValue(string Section,string Key)62
{63
if(_FileName==null || _FileName=="")return null;64
return IniFile.ReadValue(_FileName,Section,Key);65
}66

67
/// <summary>68
/// 读取键值。69
/// </summary>70
/// <param name="FileName">文件路径。</param>71
/// <param name="Section">节名称。</param>72
/// <param name="Key">键名称</param>73
/// <returns>键值。</returns>74
public static string ReadValue(string FileName,string Section,string Key)75
{76
byte[] temp=new byte[255];77
try78
{79
int l = WindowsAPI.GetPrivateProfileString(Section,Key,"",temp, temp.GetUpperBound(0) ,FileName);80
string ret = Encoding.GetEncoding(0).GetString(temp);81
return ret.Substring(0,ret.IndexOf((char)0));82
}83
catch84
{85
throw;86
}87
}88

89
/// <summary>90
/// 写入键值。91
/// </summary>92
/// <param name="Section">节名称。</param>93
/// <param name="Key">键名称。</param>94
/// <param name="Value">键值。</param>95
public void WriteValue(string Section,string Key,object Value)96
{97
if(_FileName==null || _FileName=="")return;98
IniFile.WriteValue(_FileName,Section,Key,Value);99
this.LoadDataStructure();100
}101

102
/// <summary>103
/// 写入键值。104
/// </summary>105
/// <param name="FileName">文件路径。</param>106
/// <param name="Section">节名称。</param>107
/// <param name="Key">键名称。</param>108
/// <param name="Value">键值。</param>109
public static void WriteValue(string FileName,string Section,string Key,object Value)110
{111
WindowsAPI.WritePrivateProfileString(Section,Key,Value.ToString(),FileName);112
}113

114
/// <summary>115
/// 移除节。116
/// </summary>117
/// <param name="Section">节名称。</param></param>118
public void RemoveSection(string Section)119
{120
if(_FileName==null || _FileName=="")return;121
IniFile.RemoveSection(_FileName,Section);122
this.LoadDataStructure();123
}124

125
/// <summary>126
/// 移除节。127
/// </summary>128
/// <param name="FileName">文件路径。</param>129
/// <param name="Section">节名称。</param>130
public static void RemoveSection(string FileName,string Section)131
{132
WindowsAPI.WritePrivateProfileString(Section, null, null, FileName);133
}134

135
/// <summary>136
/// 移除键值。137
/// </summary>138
/// <param name="Section">节名称。</param>139
/// <param name="Key">键名称。</param>140
public void RemoveKey(string Section,string Key)141
{142
if(_FileName==null || _FileName=="")return;143
IniFile.RemoveKey(_FileName,Section,Key);144
this.LoadDataStructure();145
}146

147
/// <summary>148
/// 移除键值。149
/// </summary>150
/// <param name="FileName">文件路径。</param>151
/// <param name="Section">节名称。</param>152
/// <param name="Key">键名称。</param>153
public static void RemoveKey(string FileName,string Section,string Key)154
{155
WindowsAPI.WritePrivateProfileString(Section, Key, null, FileName);156
}157

158
/// <summary>159
/// 返回节集合。160
/// </summary>161
public SectionCollection Sections162
{163
get{return _Sections;}164
}165

166
/// <summary>167
/// 获取文件详细信息对象。168
/// </summary>169
public FileInfo FileInfo170
{171
get{return new FileInfo(_FileName);}172
}173

174
/// <summary>175
/// 将配置写入到DataSet中。176
/// </summary>177
/// <returns></returns>178
public DataSet WriteDataSet()179
{180
DataSet ret=new DataSet();181
foreach(Section s in this.Sections)182
{183
DataTable tb=ret.Tables.Add(s.SectionName);184
tb.Columns.Add("Key");185
tb.Columns.Add("Value");186
foreach(Key k in s.Keys)187
tb.Rows.Add(new string[]{k.KeyName,k.Value});188
}189
return ret;190
}191

192
//加载INI配置文件193
private void LoadDataStructure()194
{195
if(_FileName==null || _FileName=="")return;196
_Sections.Clear(true);197
try198
{199
byte[] temp1=new byte[32767];200
byte[] temp2=new byte[32767];201
string ret1="",ret2="";202
//获取所有节203
int l1=WindowsAPI.GetPrivateProfileString(null, null, null,temp1, temp1.GetUpperBound(0), _FileName);204
ret1=Encoding.GetEncoding(0).GetString(temp1);205
ret1.Substring(0,ret1.IndexOf((char)0));206
string[] s1=FormChar(ret1);207
for(int i=0;i<s1.Length;i++)208
{209
if(s1[i].Trim()!="")210
{211
Section section=_Sections.Add(s1[i],true);212
section.Keys.SetOwner(section);213
//获取所有键214
int l2=WindowsAPI.GetPrivateProfileSection(s1[i],temp2,temp2.GetUpperBound(0),_FileName);215
ret2=Encoding.GetEncoding(0).GetString(temp2).Substring(0,l2);216
string[] s2=FormChar(ret2);217
for(int j=0;j<s2.Length;j++)218
{219
int pp=s2[j].IndexOf("=");220
if(pp>0)221
{222
if(s2[j].Trim()!="")223
{224
string k1=s2[j].Substring(0,pp).Trim();225
string k2=s2[j].Substring(pp+1,s2[j].Length-pp-1);226
Key key=section.Keys.Add(k1,k2,true);227
key.SetOwner(section);228
}229
}230
}231
}232
}233
}234
catch(Exception ex)235
{236
throw new Exception(ex.Message);237
}238
}239

240
private static string[] FormChar(string s)241
{242
ArrayList ret=new ArrayList();243
string[] ret1;244
int pos=0;245
while(true)246
{247
int p1=pos;248
pos=s.IndexOf((char)0,pos);249
if(pos<=0)break;250
string s1=s.Substring(p1,pos-p1);251
ret.Add(s1);252
pos+=1;253
}254
ret1=new string[ret.Count];255
for(int i=0;i<ret.Count;i++)256
ret1[i]=(string)ret[i];257
return ret1;258
}259

260
private static string[] FormChar(string s,bool trim)261
{262
ArrayList ret=new ArrayList();263
string[] ret1;264
int pos=0;265
while(true)266
{267
int p1=pos;268
pos=s.IndexOf((char)0,pos);269
if(pos<=0)break;270

271
string s1=s.Substring(p1,pos-p1);272
ret.Add(s1);273
pos+=1;274
}275
ret1=new string[ret.Count];276
for(int i=0;i<ret.Count;i++)277
ret1[i]=(string)ret[i];278
return ret1;279
}280
}281

282
/// <summary>283
/// 节配置集合类。284
/// </summary>285
public class SectionCollection:IEnumerable286
{287
private ArrayList _Section=new ArrayList();288

289
/// <summary>290
/// 配置节的数量。291
/// </summary>292
public int Count293
{294
get{return _Section.Count;}295
}296

297
/// <summary>298
/// 返回指定位置处的节对象。299
/// </summary>300
public Section this[int Index]301
{302
get{return (Section)_Section[Index];}303
}304

305
/// <summary>306
/// 返回指定节名称的节对象。307
/// </summary>308
public Section this[string SectionName]309
{310
get311
{312
Section ret=new Section();313
for(int i=0;i<_Section.Count;i++)314
{315
Section v=(Section)_Section[i];316
if(v.SectionName.ToLower()==SectionName.ToLower())317
{318
ret=v;319
break;320
}321
}322
return ret;323
}324
}325

326
//内部添加。327
internal Section Add(string SectionName,bool inter)328
{329
Section ret=new Section(SectionName);330
_Section.Add(ret);331
return ret;332
}333

334
//内部添加。335
internal Section Add(Section Object,bool inter)336
{337
_Section.Add(Object);338
return Object;339
}340

341
//内部清除。342
internal void Clear(bool inter)343
{344
_Section.Clear();345
}346

347
internal void Remove(int Index,bool inter)348
{349
_Section.Remove(_Section[Index]);350
}351

352
/// <summary>353
/// 添加配置节对象。354
/// </summary>355
/// <param name="SectionName">节名称。</param>356
/// <returns></returns>357
public Section Add(string SectionName)358
{359
Section ret=new Section(SectionName);360
ret.Keys.SetOwner(ret);361
WindowsAPI.WritePrivateProfileSection(SectionName, new byte[0], IniFile._FileName);362
_Section.Add(ret);363
return ret;364
}365

366
/// <summary>367
/// 清除INI文件中的所有节。368
/// </summary>369
public void Clear()370
{371
for(int i=_Section.Count-1;i>=0;i--)372
this.Remove(i);373
}374

375
/// <summary>376
/// 从集合中移除节。377
/// </summary>378
/// <param name="Index">节的索引位置。</param>379
public void Remove(int Index)380
{381
Section ret=(Section)_Section[Index];382
WindowsAPI.WritePrivateProfileString(ret.SectionName, null, null, IniFile._FileName);383
_Section.Remove(ret);384
}385

386
/// <summary>387
/// 从集合中移除节。388
/// </summary>389
/// <param name="SectionName">节的名称。</param>390
public void Remove(string SectionName)391
{392
Section ret=null;393
for(int i=0;i<_Section.Count;i++)394
{395
Section v=(Section)_Section[i];396
if(v.SectionName.ToLower()==SectionName.ToLower())397
{398
ret=v;399
break;400
}401
}402
if(ret==null)return;403
WindowsAPI.WritePrivateProfileString(ret.SectionName, null, null, IniFile._FileName);404
_Section.Remove(ret);405
}406

407
/// <summary>408
/// 检测指定的节是否包含在此集合中。409
/// </summary>410
/// <param name="SectionName">节名称。</param>411
/// <returns></returns>412
public bool Contains(string SectionName)413
{414
foreach(Section s in this)415
if(s.SectionName.ToLower()==SectionName.ToLower())416
return true;417
return false;418
}419

420
IEnumerator IEnumerable.GetEnumerator()421
{422
return new Section(this);423
}424
}425

426
/// <summary>427
/// 节配置类。428
/// </summary>429
public class Section:IEnumerator430
{431
private int nIndex;432
SectionCollection enu;433
private string _SectionName="";434
private KeyCollection _Keys=new KeyCollection();435
436
public Section()437
{438
}439

440
internal Section(SectionCollection sc)441
{442
enu=sc;443
nIndex=-1;444
}445

446
/// <summary>447
/// 构造类。448
/// </summary>449
/// <param name="SectionName">节名称。</param>450
public Section(string SectionName)451
{452
_SectionName=SectionName;453
}454

455
/// <summary>456
/// 返回此节中的所有键。457
/// </summary>458
public KeyCollection Keys459
{460
get{return _Keys;}461
}462

463
/// <summary>464
/// 返回此节中的指定位置的键。465
/// </summary>466
public Key this[int Index]467
{468
get{return _Keys[Index];}469
}470

471
/// <summary>472
/// 返回节名称。473
/// </summary>474
public string SectionName475
{476
get{return _SectionName;}477
set{_SectionName=value;}478
}479

480
/// <summary>481
/// 清除此节下的所有键。482
/// </summary>483
public void Clear()484
{485
WindowsAPI.WritePrivateProfileSection(_SectionName, new byte[0], IniFile._FileName);486
_Keys.Clear();487
}488

489
/// <summary>490
/// 移除此节。491
/// </summary>492
public void Remove()493
{494
WindowsAPI.WritePrivateProfileString(_SectionName, null, null, IniFile._FileName);495
}496

497
void IEnumerator.Reset()498
{499
nIndex=-1;500
}501

502
object IEnumerator.Current503
{504
get{return enu[nIndex];}505
}506

507
bool IEnumerator.MoveNext()508
{509
nIndex++;510
return(nIndex < enu.Count);511
}512
}513

514
/// <summary>515
/// 键集合类。516
/// </summary>517
public class KeyCollection:IEnumerable518
{519
private ArrayList _Key=new ArrayList();520
private Section _Owner;521

522
/// <summary>523
/// 返回键数量。524
/// </summary>525
public int Count526
{527
get{return _Key.Count;}528
}529

530
internal void SetOwner(Section v)531
{532
_Owner=v;533
}534

535
/// <summary>536
/// 返回指定位置的键。537
/// </summary>538
public Key this[int Index]539
{540
get541
{542
return (Key)_Key[Index];543
}544
}545

546
/// <summary>547
/// 返回指定名称的键。548
/// </summary>549
public Key this[string KeyName]550
{551
get552
{553
Key ret=new Key();554
for(int i=0;i<_Key.Count;i++)555
{556
Key v=(Key)_Key[i];557
if(v.KeyName.ToLower()==KeyName.ToLower())558
{559
ret=v;560
break;561
}562
}563
return ret;564
}565
}566

567
//内部添加568
internal Key Add(string KeyName,string Value,bool inter)569
{570
Key ret=new Key(KeyName,Value);571
_Key.Add(ret);572
return ret;573

574
}575

576
//内部清除577
internal void Clear(bool inter)578
{579
_Key.Clear();580
}581

582
//移除583
internal void Remove(int Index,bool inter)584
{585
_Key.Remove(_Key[Index]);586
}587

588
/// <summary>589
/// 添加配置键对象。590
/// </summary>591
/// <param name="KeyName">键名称。</param>592
/// <param name="Value">键值。</param>593
/// <returns></returns>594
public Key Add(string KeyName,string Value)595
{596
Key ret=new Key(KeyName,Value);597
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, KeyName, Value, IniFile._FileName);598
_Key.Add(ret);599
return ret;600
}601

602
/// <summary>603
/// 清除INI文件中的所有节。604
/// </summary>605
public void Clear()606
{607
for(int i=_Key.Count-1;i>=0;i--)608
this.Remove(i);609
}610

611
/// <summary>612
/// 从集合中移除节。613
/// </summary>614
/// <param name="Index">节的索引位置。</param>615
public void Remove(int Index)616
{617
Key ret=(Key)_Key[Index];618
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, ret.KeyName, null, IniFile._FileName);619
_Key.Remove(ret);620
}621

622
/// <summary>623
/// 从集合中移除节。624
/// </summary>625
/// <param name="KeyName">节的名称。</param>626
public void Remove(string KeyName)627
{628
Key ret=null;629
for(int i=0;i<_Key.Count;i++)630
{631
Key v=(Key)_Key[i];632
if(v.KeyName.ToLower()==KeyName.ToLower())633
{634
ret=v;635
break;636
}637
}638
if(ret==null)return;639
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, ret.KeyName, null, IniFile._FileName);640
_Key.Remove(ret);641
}642

643
/// <summary>644
/// 检测指定的键是否包含在此集合中。645
/// </summary>646
/// <param name="KeyName">键名称。</param>647
/// <returns></returns>648
public bool Contains(string KeyName)649
{650
foreach(Key k in this)651
if(k.KeyName.ToLower()==KeyName.ToLower())652
return true;653
return false;654
}655

656
IEnumerator IEnumerable.GetEnumerator()657
{658
return new Key(this);659
}660
}661

662
/// <summary>663
/// 键类。664
/// </summary>665
public class Key:IEnumerator666
{667
private int nIndex;668
KeyCollection enu;669
private string _KeyName="";670
private string _Value="";671
private Section _Owner;672

673
public Key()674
{675
}676

677
internal Key(KeyCollection kc)678
{679
enu=kc;680
nIndex=-1;681
}682

683
/// <summary>684
/// 构造类。685
/// </summary>686
/// <param name="KeyName">键名称。</param>687
/// <param name="Value">键值。</param>688
public Key(string KeyName,string Value)689
{690
_KeyName=KeyName;691
_Value=Value;692
}693

694
internal void SetOwner(Section v)695
{696
_Owner=v;697
}698

699
/// <summary>700
/// 返回键名称。701
/// </summary>702
public string KeyName703
{704
get{return _KeyName;}705
set{_KeyName=value;}706
}707

708
/// <summary>709
/// 设置或返回键值。710
/// </summary>711
public string Value712
{713
get{return _Value;}714
set{715
_Value=value;716
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, _KeyName, _Value, IniFile._FileName);717
}718
}719

720
/// <summary>721
/// 移除此键。722
/// </summary>723
public void Remove()724
{725
WindowsAPI.WritePrivateProfileString(_Owner.SectionName, _KeyName, null, IniFile._FileName);726
}727

728
void IEnumerator.Reset()729
{730
nIndex=-1;731
}732

733
object IEnumerator.Current734
{735
get{return enu[nIndex];}736
}737

738
bool IEnumerator.MoveNext()739
{740
nIndex++;741
return(nIndex < enu.Count);742
}743
}744

745
internal class WindowsAPI746
{747
[DllImport("kernel32", EntryPoint="GetPrivateProfileSectionA")]748
internal static extern int GetPrivateProfileSection(string lpAppName,byte[] lpReturnedString,int nSize,string filePath);749

750
[DllImport("kernel32", EntryPoint="GetPrivateProfileStringA")]751
internal static extern int GetPrivateProfileString(string section,string key,string def, byte[] retVal,int size,string filePath);752
753
[DllImport("kernel32.dll")]754
internal extern static int WritePrivateProfileSection(string segName,byte [] sData,string fileName);755

756
[DllImport("kernel32", EntryPoint="WritePrivateProfileStringA")]757
internal static extern int WritePrivateProfileString(string section,string key,string val,string filePath);758

759
}760

761
}
