using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Runtime.InteropServices;
|
using System.Text;
|
|
namespace UtilLib
|
{
|
public class IniHelper
|
{
|
#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
|
|
/// <summary>
|
/// 获取某个section下的所有key和value
|
/// </summary>
|
/// <param name="iniFile"></param>
|
/// <param name="section"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
public static List<string> ReadListBySection(string iniFile, string section)
|
{
|
int size = 65536;
|
byte[] buffer = new byte[size];
|
List<string> result = new List<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))
|
{
|
result.Add(pair);
|
}
|
}
|
}
|
return result;
|
}
|
|
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, 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 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;
|
}
|
|
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;
|
}
|
}
|
}
|