读书人

如何修改INI文件中标题下面的键值

发布时间: 2012-02-05 12:07:14 作者: rapoo

怎么修改INI文件中标题下面的键值
[NEWS]
m1=01
m2=01
怎么把m1修改为m3.

[解决办法]
添个m3=01
……
[解决办法]
添个m3=01
删个m1=01
[解决办法]
#region 读写ini文件 API定义
[DllImport( "kernel32.dll ", EntryPoint = "WritePrivateProfileStringA ")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport( "kernel32.dll ", EntryPoint = "GetPrivateProfileStringA ")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
#endregion

/// <summary>
/// 写INI文件
/// </summary>
/// <param name= "Section "> 配置目录 </param>
/// <param name= "Key "> 参数 </param>
/// <param name= "Value "> 值 </param>
/// <param name= "IniPath "> 路径 </param>
public static bool IniWriteValue(string Section, string Key, string Value, string IniPath)
{
try
{
WritePrivateProfileString(Section, Key, Value, IniPath);
return true;
}
catch
{
return false;
}

}
/// <summary>
/// 读INI文件
/// </summary>
/// <param name= "Section "> 配置目录 </param>
/// <param name= "Key "> 参数 </param>
/// <param name= "IniPath "> 路径 </param>
/// <returns> 返回值 </returns>
public static string IniReadValue(string Section, string Key, string IniPath)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, " ", temp, 255, IniPath);
return temp.ToString();
}
[解决办法]
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace IniFiles
{
public abstract class CustomIniFile
{
public CustomIniFile(string AFileName)
{
FFileName = AFileName;
}
private string FFileName;
public string FileName
{
get { return FFileName; }
}
public virtual bool SectionExists(string Section)
{
List <string> vStrings = new List <string> ();
ReadSections(vStrings);
return vStrings.Contains(Section);
}
public virtual bool ValueExists(string Section, string Ident)
{
List <string> vStrings = new List <string> ();
ReadSection(Section, vStrings);
return vStrings.Contains(Ident);
}
public abstract string ReadString(string Section, string Ident, string Default);
public abstract bool WriteString(string Section, string Ident, string Value);
public abstract bool ReadSectionValues(string Section, List <string> Strings);
public abstract bool ReadSection(string Section, List <string> Strings);
public abstract bool ReadSections(List <string> Strings);


public abstract bool EraseSection(string Section);
public abstract bool DeleteKey(string Section, string Ident);
public abstract bool UpdateFile();
}

/// <summary>
/// 存储本地INI文件的类。
/// </summary>
public class IniFile : CustomIniFile
{
[DllImport( "kernel32 ")]
private static extern uint GetPrivateProfileString(
string lpAppName,// points to section name
string lpKeyName,// points to key name
string lpDefault,// points to default string
byte[] lpReturnedString,// points to destination buffer
uint nSize,// size of destination buffer
string lpFileName // points to initialization filename
);

[DllImport( "kernel32 ")]
private static extern bool WritePrivateProfileString(
string lpAppName,// pointer to section name
string lpKeyName,// pointer to key name
string lpString,// pointer to string to add
string lpFileName // pointer to initialization filename
);

/// <summary>
/// 构造IniFile实例。
/// <param name= "AFileName "> 指定文件名 </param>
/// </summary>
public IniFile(string AFileName)
: base(AFileName)
{
}

/// <summary>
/// 析够IniFile实例。
/// </summary>
~IniFile()
{
UpdateFile();
}

/// <summary>
/// 读取字符串值。
/// <param name= "Ident "> 指定变量标识。 </param>
/// <param name= "Section "> 指定所在区域。 </param>
/// <param name= "Default "> 指定默认值。 </param>
/// <returns> 返回读取的字符串。如果读取失败则返回该值。 </returns>
/// </summary>
public override string ReadString(string Section, string Ident, string Default)
{
byte[] vBuffer = new byte[2048];
uint vCount = GetPrivateProfileString(Section,
Ident, Default, vBuffer, (uint)vBuffer.Length, FileName);
return Encoding.Default.GetString(vBuffer, 0, (int)vCount);
}
/// <summary>
/// 写入字符串值。
/// </summary>
/// <param name= "Section "> 指定所在区域。 </param>
/// <param name= "Ident "> 指定变量标识。 </param>
/// <param name= "Value "> 所要写入的变量值。 </param>
/// <returns> 返回写入是否成功。 </returns>
public override bool WriteString(string Section, string Ident, string Value)
{
return WritePrivateProfileString(Section, Ident, Value, FileName);
}

/// <summary>
/// 获得区域的完整文本。(变量名=值格式)。
/// </summary>
/// <param name= "Section "> 指定区域标识。 </param>
/// <param name= "Strings "> 输出处理结果。 </param>
/// <returns> 返回读取是否成功。 </returns>
public override bool ReadSectionValues(string Section, List <string> Strings)
{
List <string> vIdentList = new List <string> ();
if (!ReadSection(Section, vIdentList)) return false;
foreach (string vIdent in vIdentList)
Strings.Add(string.Format( "{0}={1} ", vIdent, ReadString(Section, vIdent, " ")));


return true;
}

/// <summary>
/// 读取区域变量名列表。
/// </summary>
/// <param name= "Section "> 指定区域名。 </param>
/// <param name= "Strings "> 指定输出列表。 </param>
/// <returns> 返回获取是否成功。 </returns>
public override bool ReadSection(string Section, List <string> Strings)
{
byte[] vBuffer = new byte[16384];
uint vLength = GetPrivateProfileString(Section, null, null, vBuffer,
(uint)vBuffer.Length, FileName);
int j = 0;
for (int i = 0; i < vLength; i++)
if (vBuffer[i] == 0)
{
Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
j = i + 1;
}
return true;
}

/// <summary>
/// 读取区域名列表。
/// </summary>
/// <param name= "Strings "> 指定输出列表。 </param>
/// <returns> </returns>
public override bool ReadSections(List <string> Strings)
{
byte[] vBuffer = new byte[16384];
uint vLength = GetPrivateProfileString(null, null, null, vBuffer,
(uint)vBuffer.Length, FileName);
int j = 0;
for (int i = 0; i < vLength; i++)
if (vBuffer[i] == 0)
{
Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
j = i + 1;
}
return true;
}

/// <summary>
/// 删除指定区域。
/// </summary>
/// <param name= "Section "> 指定区域名。 </param>
/// <returns> 返回删除是否成功。 </returns>
public override bool EraseSection(string Section)
{
return WritePrivateProfileString(Section, null, null, FileName);
}

/// <summary>
/// 删除指定变量。
/// </summary>
/// <param name= "Section "> 变量所在区域。 </param>
/// <param name= "Ident "> 变量标识。 </param>
/// <returns> 返回删除是否成功。 </returns>
public override bool DeleteKey(string Section, string Ident)
{
return WritePrivateProfileString(Section, Ident, null, FileName);
}

/// <summary>
/// 更新文件。
/// </summary>
/// <returns> 返回更新是否成功。 </returns>
public override bool UpdateFile()
{
return WritePrivateProfileString(null, null, null, FileName);
}
}
}

//通过SectionExists()可以知道
[解决办法]
Read/Write XML files, Config files, INI files, or the Registry
By Alvaro Mendez
http://www.codeproject.com/csharp/readwritexmlini.asp

读书人网 >C#

热点推荐