5月
28
2010
28
2010
C#でのINIファイルの操作
C#.NETには、標準ではINIファイルを簡単に利用できるクラスが存在していない。というのも.NETでは、INIファイルの使用が推奨されていないからだ。
そんなわけで「@IT:.NET TIPS INIファイルを読み書きするには? – C#」を参考にクラスを書いてみました。
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
namespace util
{
class IniFileManager
{
#region Member
private string path;
#endregion
#region Accessor
public string Path
{
set { path = value; }
get { return path; }
}
#endregion
#region Contructor
/// <summary>
/// コンストラクタ
/// </summary>
public IniFileManager()
{
}
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="path">INIファイルのパス</param>
public IniFileManager(string path)
{
Path = path;
}
#endregion
#region Public Method
/// <summary>
/// プロパティを書き込む
/// </summary>
/// <param name="path">INIファイルのパス</param>
public void writeProperty (string section, string key, string property)
{
WritePrivateProfileString(section, key, property, path);
}
/// <summary>
/// セクションとキーからプロパティを取得する
/// </summary>
/// <param name="path">INIファイルのパス</param>
/// <returns>指定したセクション内にあるキーのプロパティ</returns>
public string getProperty(string section, string key) {
StringBuilder sb = new StringBuilder(1024);
GetPrivateProfileString(section, key, "", sb, (uint)sb.Capacity, path);
return sb.ToString();
}
/// <summary>
/// セクションとキーから整数としてプロパティを取得する
/// </summary>
/// <param name="path">INIファイルのパス</param>
/// <returns>指定したセクション内にあるキーの整数プロパティ</returns>
public int getPropertyInt(string section, string key)
{
return (int)GetPrivateProfileInt(section, key, 0, path);
}
/// <summary>
/// セクション一覧を取得する
/// </summary>
/// <returns>セクション一覧</returns>
public String[] getSections()
{
byte[] b = new byte[1024];
uint resultSize = GetPrivateProfileStringByByteArray(null, null, "", b, (uint)b.Length, path);
if (resultSize == 0)
{
return null;
}
string result = Encoding.Default.GetString(b, 0, (int)resultSize - 1);
return result.Split('');
}
/// <summary>
/// セクションからキー一覧を取得する
/// </summary>
/// <param name="section">セクション名</param>
/// <returns>指定したセクション内にあるキー一覧</returns>
public string[] getKeys(string section)
{
byte[] b = new byte[1024];
uint resultSize = GetPrivateProfileStringByByteArray(
section, null, "", b, (uint)b.Length, path);
if (resultSize == 0)
{
return null;
}
string result = Encoding.Default.GetString(b, 0, (int)resultSize - 1);
return result.Split('');
}
/// <summary>
/// 指定したセクション内にあるキーのプロパティを削除する
/// </summary>
/// <param name="section">セクション名</param>
/// <param name="key">キー</param>
public void removeAt(string section, string key)
{
WritePrivateProfileString(section, key, null, path);
}
/// <summary>
/// 指定したセクション内にあるキーをすべて削除する
/// </summary>
/// <param name="section">セクション名</param>
public void removeAt(string section)
{
WritePrivateProfileString(section, null, null, path);
}
#endregion
#region KERNEL32.DLL
[DllImport("KERNEL32.DLL")]
public static extern uint
GetPrivateProfileString(string lpAppName,
string lpKeyName, string lpDefault,
StringBuilder lpReturnedString, uint nSize,
string lpFileName);
[DllImport("KERNEL32.DLL",
EntryPoint = "GetPrivateProfileString")]
public static extern uint
GetPrivateProfileStringByByteArray(string lpAppName,
string lpKeyName, string lpDefault,
byte[] lpReturnedString, uint nSize,
string lpFileName);
[DllImport("KERNEL32.DLL")]
public static extern uint
GetPrivateProfileInt(string lpAppName,
string lpKeyName, int nDefault, string lpFileName);
[DllImport("KERNEL32.DLL")]
public static extern uint WritePrivateProfileString(
string lpAppName,
string lpKeyName,
string lpString,
string lpFileName);
#endregion
}
}
注意
どのプロパティをゲットしようとしても、nullが返ってくる場合、ファイルパスが誤ってる可能性があります。
筆者の場合、それでかなり悩みました(‘A`)

An article by yuyak




