C# で INI ファイルの読み書きをする

Muhammad Zeeshan 2023年10月12日
  1. C#INI ファイルとは
  2. WritePrivateProfileString を使用して、新規および変更された設定を C# の INI ファイルに保存する
  3. C#ReadPrivateProfileString を使用して INI ファイルからデータを読み取ります
  4. C#INI ファイルの読み書きをする
C# で INI ファイルの読み書きをする

このチュートリアルでは、C# で INI ファイルを読み書きする方法を説明します。

C#INI ファイルとは

初期化ファイルは、INI ファイルと呼ばれることが多く、プログラム構成情報を保存するためのテキストファイルです。 .NET Framework は、INI ファイルをネイティブにサポートしていません。

Platform InvocationServices を使用して WindowsAPI メソッドを利用して、ファイルへの書き込みとファイルからの読み取りを行うことができます。このチュートリアルでは、INI ファイルを表すクラスを作成し、WindowsAPI 操作でそれらを操作します。

INI ファイルを操作するには、WritePrivateProfileStringReadPrivateProfileString の 2つの WindowsAPI 関数が必要です。

WritePrivateProfileString を使用して、新規および変更された設定を C# の INI ファイルに保存する

INI ファイルでは、WritePrivateProfileString が新規および変更された設定を保存します。構成は以下のとおりです。

bool WritePrivateProfileString(string name, string key, string value, string filepath);

この関数は、書き込みが成功した場合は true、書き込みが失敗した場合は false のブール結果を返します。以下はパラメータです。

  1. 書き込むセクションの名前は、name で指定されます。
  2. 設定するキーの名前は key で指定します。
  3. キーの値は value で指定されます。
  4. filepath は、更新される INI ファイルの場所を保持します。

C#ReadPrivateProfileString を使用して INI ファイルからデータを読み取ります

ReadPrivateProfileStringINI ファイルからデータを読み取ります。この関数は、アプリケーションに応じて、単一の値、セクションからのすべてのキー名、またはすべてのセクション名を読み取ります。

int GetPrivateProfileString(string name, string key, string default, StringBuilder ReturnedVal,
                            int maxsize, string filepath);

戻り値の文字数は、関数によって符号なし整数として返されます。以下はパラメータです。

  1. 読み取るセクションの名前は name で指定されます。これが null に設定されている場合、すべてのセクション名が返されます。
  2. 読み取るキーの名前は key で指定されます。name が null でないときに null に設定すると、戻り値には指定されたセクションのキーの名前が含まれます。
  3. キーが存在しない場合、default は返すデフォルト値を指定します。
  4. ReturnedVal は、バッファとして機能する文字列を受け取ります。操作の結果はバッファに書き込まれ、文字列の値を変更します。
  5. ReturnedVal で返される文字列の最大サイズは、maxsize で指定されます。これは、バッファサイズと同じである必要があります。INI ファイルから読み取られた値が ReturnedVal より長い場合、値は減少します。
  6. 読み取る INI ファイルの場所と名前は、filepath で指定されます。このファイルが存在する必要があります。

C#INI ファイルの読み書きをする

構造を確認したので、使用する WindowsAPI 関数の構造を保持するクラスを作成しましょう。

次のライブラリを追加します。

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

ReadWriteINIfile という名前の新しいクラスを作成し、次のクラスコードを使用します。クラス自体にはアクセス修飾子がないため、内部スコープがあります。

IniFile クラスは、API 関数を公開せずに API 関数にアクセスします。

public class ReadWriteINIfile {
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string name, string key, string val,
                                                       string filePath);
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section, string key, string def,
                                                    StringBuilder retVal, int size,
                                                    string filePath);
}

これで、ReadWriteINIfile クラスを作成できるようになり、API 操作を知らなくても INI ファイルを読み取ることができます。

次のコードをクラスに追加して、コンストラクターを作成します。

public ReadWriteINIfile(string inipath) {
  path = inipath;
}

WritePrivateProfileString は、INI ファイルに値を入力するために使用されます。以下のコードでは、セクション名とキー名、および保存する値を受け入れるために 3つの引数が使用されています。

WritePrivateProfileString の呼び出しでは、これらの値がコンストラクターに渡されたファイル名と組み合わされます。

public void WriteINI(string name, string key, string value) {
  WritePrivateProfileString(name, key, value, this.path);
}

ReadINI の引数は、読み取る名前キーです。上記のコードの最初の行は文字列を定義し、その値を最大長に等しいいくつかのスペースに設定します。

GetPrivateProfileString 関数は、この文字列を入力するバッファとして受け取ります。以下のコードを使用してください。

public string ReadINI(string name, string key) {
  StringBuilder sb = new StringBuilder(255);
  int ini = GetPrivateProfileString(name, key, "", sb, 255, this.path);
  return sb.ToString();
}

完全なソースコード:

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

namespace Test {
  class Program {
    static void Main(string[] args) {}
  }
  public class ReadWriteINIfile {
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string name, string key, string val,
                                                         string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section, string key, string def,
                                                      StringBuilder retVal, int size,
                                                      string filePath);

    public string path;

    public ReadWriteINIfile(string inipath) {
      path = inipath;
    }
    public void WriteINI(string name, string key, string value) {
      WritePrivateProfileString(name, key, value, this.path);
    }
    public string ReadINI(string name, string key) {
      StringBuilder sb = new StringBuilder(255);
      int ini = GetPrivateProfileString(name, key, "", sb, 255, this.path);
      return sb.ToString();
    }
  }
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn