wenxiangchao
4 天以前 559890c482f5973f06aafdfec9550fee5ba3c7f2
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
 
namespace HMI.Util
{
    public class IniFileHelper
    {
        private static String filePath = "./default.ini";
        static List<string> sections = new List<string>();
        static List<string> keys = new List<string>();
        #region API函数声明
 
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key,
            string val, string filePath);
 
        //需要调用GetPrivateProfileString的重载
        [DllImport("kernel32", EntryPoint = "GetPrivateProfileString")]
        private static extern long GetPrivateProfileString(string section, string key,
            string def, StringBuilder retVal, int size, string filePath);
 
        [DllImport("kernel32", EntryPoint = "GetPrivateProfileString")]
        private static extern uint GetPrivateProfileStringA(string section, string key,
            string def, Byte[] retVal, int size, string filePath);
 
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileSection(string section, byte[] retVal, int size, string filePath);
 
        #endregion
        public static List<string> ReadSections()
        {
            return ReadSections(filePath);
        }
 
        public static List<string> ReadSections(string iniFilename)
        {
            List<string> result = new List<string>();
            Byte[] buf = new Byte[65536];
            uint len = GetPrivateProfileStringA(null, null, null, buf, buf.Length, iniFilename);
            int j = 0;
            for (int i = 0; i < len; i++)
                if (buf[i] == 0)
                {
                    result.Add(Encoding.Default.GetString(buf, j, i - j));
                    j = i + 1;
                }
            return result;
        }
 
        public static List<string> ReadKeys(String SectionName)
        {
            return ReadKeys(SectionName, filePath);
        }
 
        public static List<string> ReadKeys(string SectionName, string iniFilename)
        {
            List<string> result = new List<string>();
            Byte[] buf = new Byte[65536];
            uint len = GetPrivateProfileStringA(SectionName, null, null, buf, buf.Length, iniFilename);
            int j = 0;
            for (int i = 0; i < len; i++)
                if (buf[i] == 0)
                {
                    result.Add(Encoding.Default.GetString(buf, j, i - j));
                    j = i + 1;
                }
            return result;
        }
        public static void SetFilePath(String filepath)
        {
            filePath = filepath;
        }
        #region 读Ini文件
 
        public static string ReadIniData(string Section, string Key, string NoText)
        {
            return ReadIniData(Section, Key, NoText, filePath);
        }
 
        public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                StringBuilder temp = new StringBuilder(1024);
                GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
                return temp.ToString();
            }
            else
                return NoText;
        }
 
        #endregion
 
        #region 写Ini文件
 
 
        public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath)
        {
            if (File.Exists(iniFilePath) == false)
 
            {
                FileStream FS = new FileStream(iniFilePath, FileMode.CreateNew);
            }
            long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);
            if (OpStation == 0)
                return false;
            else
                return true;
        }
        #endregion
 
        public static Dictionary<string, string> GetKeyValuesBySection(string iniFile, string section)
        {
            int size = 65536;
            byte[] buffer = new byte[size];
 
            Dictionary<string, string> result = new Dictionary<string, string>();
            int bytesRead = GetPrivateProfileSection(section, buffer, size, iniFile);
            if (bytesRead > 0)
            {
                string sectionData = Encoding.Default.GetString(buffer, 0, bytesRead - 1);
                string[] keyValuePairs = sectionData.Split('\0');
 
                foreach (string pair in keyValuePairs)
                {
                    if (!string.IsNullOrEmpty(pair))
                    {
                        int equalSignIndex = pair.IndexOf('=');
                        if (equalSignIndex > 0)
                        {
                            string key = pair.Substring(0, equalSignIndex).Trim();
                            string value = pair.Substring(equalSignIndex + 1).Trim();
                            result[key] = value;
                        }
                    }
                }
            }
            return result;
        }
    }
}