iniファイルを扱うクラスを作成してみた。
http://www.atmarkit.co.jp/fdotnet/dotnettips/039inifile/inifile.html
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace SystemPlan.System.WindowsAPI
{
///
/// Windows固有の設定ファイルであるiniファイルを読み書きできる機能を提供する。
/// 本クラスは、KERNEL32.DLL を呼び出しており、windows依存である事に注意。
///
public class IniFileHandler
{
[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileString")]
private static extern uint
DllGetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);
[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA")]
private static extern uint
DllGetPrivateProfileStringByByteArray(
string lpAppName,
string lpKeyName, string lpDefault,
byte[] lpReturnedString, uint nSize,
string lpFileName);
[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileInt")]
private static extern uint
DllGetPrivateProfileInt(
string lpAppName,
string lpKeyName,
int nDefault,
string lpFileName);
// GetLastError を用いたい場合は、SetLastError=true を宣言しておく必要あがるらしい
[DllImport("KERNEL32.DLL",SetLastError=true, EntryPoint = "WritePrivateProfileString")]
private static extern uint
DllWritePrivateProfileString(
string lpAppName,
string lpKeyName,
string lpString,
string lpFileName);
///
///iniファイルから文字列を読み出す。
///
///iniファイル名をフルパスで指定
///キー
///セクション名
///取得した文字列。取得に失敗した場合は、“”空文字が返却される
///
public static String GetPrivateProfileString(string fileName,string sectionName, string key)
{
return IniFileHandler.GetPrivateProfileString(fileName, sectionName, key, "");
}
///
///iniファイルから文字列を読み出す。
///
///iniファイル名をフルパスで指定
///キー
///セクション名
///iniファイルから取得できなかった場合に返却する文字列
///取得した文字列。取得に失敗した場合は、defaultStrigngが返却される
///
public static String GetPrivateProfileString(string fileName, string sectionName, string key, string defaultStrigng)
{
if (String.IsNullOrEmpty(fileName))
{
throw new ArgumentException("fileName is NullOrEmpty");
}
if (String.IsNullOrEmpty(sectionName))
{
throw new ArgumentException("sectionName is NullOrEmpty");
}
if (String.IsNullOrEmpty(key))
{
throw new ArgumentException("key is NullOrEmpty");
}
if (defaultStrigng == null)
{
throw new ArgumentException("defaultStrigng is NullOrEmpty");
}
StringBuilder sb = new StringBuilder(1024);
IniFileHandler.DllGetPrivateProfileString(sectionName, key, defaultStrigng, sb, (uint)sb.Capacity, fileName);
return sb.ToString();
}
///
///iniファイルから整数値を読み出す。
///
///iniファイル名をフルパスで指定
///セクション名
///キー
///取得した整数値。取得に失敗した場合は、-1 が返却される
///
public static int GetPrivateProfileInt(string fileName, string sectionName, string key)
{
return GetPrivateProfileInt(fileName, sectionName, key, -1);
}
///
///iniファイルから整数値を読み出す。
///
///iniファイル名をフルパスで指定
///セクション名
///キー
///iniファイルから取得できなかった場合に返却する整数値
///取得した整数値。取得に失敗した場合は、defaultStrigngが返却される
///
public static int GetPrivateProfileInt(string fileName, string sectionName, string key, int defalultValue)
{
if (String.IsNullOrEmpty(fileName))
{
throw new ArgumentException("fileName is NullOrEmpty");
}
if (String.IsNullOrEmpty(sectionName))
{
throw new ArgumentException("sectionName is NullOrEmpty");
}
if (String.IsNullOrEmpty(key))
{
throw new ArgumentException("key is NullOrEmpty");
}
int resultValue;
resultValue = (int)DllGetPrivateProfileInt(sectionName, key,defalultValue, fileName);
return resultValue;
}
///
/// iniファイルに情報を書き込む。
/// 既に存在している時は、値を更新する。
/// 無いときは、作成される。
///
/// iniファイル名をフルパスで指定
/// セクション名
/// キー
/// 設定する値
public static void WritePrivateProfileString(string fileName, string sectionName, string key, string stringValue)
{
if (String.IsNullOrEmpty(fileName))
{
throw new ArgumentException("fileName is NullOrEmpty");
}
if (String.IsNullOrEmpty(sectionName))
{
throw new ArgumentException("sectionName is NullOrEmpty");
}
if (String.IsNullOrEmpty(key))
{
throw new ArgumentException("key is NullOrEmpty");
}
if (String.IsNullOrEmpty(stringValue))
{
throw new ArgumentException("stringValue is NullOrEmpty");
}
uint result;
result = DllWritePrivateProfileString(sectionName, key, stringValue, fileName);
if (result == 0)
{
// http://blog.tbl.jp/2007/10/cwin32apigetlasterror.html
// http://ir9.jp/prog/ayu/win32err.htm
int resutltGetLastError = Marshal.GetLastWin32Error();
string exceptionString= string.Format("WritePrivateProfileString Error. GetLastError()={0}", resutltGetLastError);
throw new Exception(exceptionString);
}
}
///
///指定ファイルのセクションの一覧を得る
///
/// iniファイル名をフルパスで指定
/// セクション名の配列。取得に失敗した場合は、ゼロ個の配列を返却する
public static string[] GetPrivateProfileSectionNames(string fileName)
{
if (String.IsNullOrEmpty(fileName))
{
throw new ArgumentException("fileName is NullOrEmpty");
}
/*
* 正しいセクションキーには、空白のセクションキーは存在しない事を前提とした。
* よって、空白のセクションキーだけの場合は、取得ができなかった事にして
* ゼロ個の配列を返却する事にする
*/
byte[] byteArray = new byte[1024];
uint resultSize = DllGetPrivateProfileStringByByteArray(
null,
null,
"*", //lpDefault 何か 1バイト分設定しておく必要あり。そうしないと、例外が発生してしまう
byteArray,
(uint)byteArray.Length,
fileName);
string resultString = Encoding.Default.GetString(byteArray, 0, (int)resultSize -1 );
string[] sections = resultString.Split('\0');
//空白だけのセクションの場合は、ゼロ個の配列を返却
if ((sections.Length == 1) && (sections[0].Trim().Equals(""))){
sections = new string[0];
}
return sections;
}
///
/// 指定セクションのキーの一覧を得る
///
/// iniファイル名をフルパスで指定
/// セクション名
/// キー名の配列。取得に失敗した場合は、ゼロ個の配列を返却する
public static string[] GetPrivateProfileKeys(string fileName, string sectionName)
{
if (String.IsNullOrEmpty(fileName))
{
throw new ArgumentException("fileName is NullOrEmpty");
}
if (String.IsNullOrEmpty(sectionName))
{
throw new ArgumentException("sectionName is NullOrEmpty");
}
byte[] byteArray = new byte[1024];
uint resultSize = DllGetPrivateProfileStringByByteArray(
sectionName,
null,
"*", //lpDefault 何か 1バイト分設定しておく必要あり。そうしないと、例外が発生してしまう
byteArray,
(uint)byteArray.Length,
fileName);
string resultString = Encoding.Default.GetString(byteArray, 0, (int)resultSize - 1);
string[] sections = resultString.Split('\0');
//空白だけのセクションの場合は、ゼロ個の配列を返却
if ((sections.Length == 1) && (sections[0].Trim().Equals("")))
{
sections = new string[0];
}
return sections;
}
}
}
使用する側のサンプル
//キーの値を読み込む(文字)
string ss = IniFileHandler.GetPrivateProfileString(@"c:\sample.ini", "アプリ1", "キー1");
ss = IniFileHandler.GetPrivateProfileString(" ", "アプリ1", "キー1");
//キーの値を読み込む(整数値)
int resultValue = IniFileHandler.GetPrivateProfileInt(@"c:\sample.ini", "アプリ1", "キー2", 9);
//キーの値を読み込む(整数値)
resultValue = IniFileHandler.GetPrivateProfileInt(@"c:\sample.ini", "アプリ1", "キー1");
//セクションの一覧を取得する
string[] resultString = IniFileHandler.GetPrivateProfileSectionNames(@"c:\sample.ini");
Console.WriteLine("キーの数={0}", resultString.Length);
foreach (string key in resultString)
{
Console.WriteLine(
"アプリ1セクションに含まれるキー名: {0}", key);
}
//キーの一覧を取得する
string[] resultString2;
resultString2 = IniFileHandler.GetPrivateProfileKeys(@"c:\sample.ini", "アプリ1");
//resultString2 = IniFileHandler.GetPrivateProfileKeys(null, "アプリ1");
Console.WriteLine("キーの数={0}", resultString2.Length);
foreach (string key in resultString2)
{
Console.WriteLine(
"アプリ1セクションに含まれるキー名: {0}", key);
}
//データを書き込む
IniFileHandler.WritePrivateProfileString(@"c:\sample.ini", "sec1", "app1", "データ");