5月
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`)

参考リンク

  1. C# Programming
  2. @IT:.NET TIPS INIファイルを読み書きするには? – C#

Related Posts

About the Author:

大阪のプログラマー(87世代)。 関心: C/C++, Objective-C, C#, TopCoder, Unix, Java, PHP, JavaScriptなど。 最近はWebサービスに夢中です!

Leave a comment


Now loading...

PR

Flickr