C# で INI ファイルの読み書きをする
-
C#
のINI
ファイルとは -
WritePrivateProfileString
を使用して、新規および変更された設定をC#
の INI ファイルに保存する -
C#
でReadPrivateProfileString
を使用して INI ファイルからデータを読み取ります -
C#
でINI
ファイルの読み書きをする
このチュートリアルでは、C# で INI
ファイルを読み書きする方法を説明します。
C#
の INI
ファイルとは
初期化ファイルは、INI
ファイルと呼ばれることが多く、プログラム構成情報を保存するためのテキストファイルです。 .NET Framework は、INI
ファイルをネイティブにサポートしていません。
Platform InvocationServices を使用して WindowsAPI メソッドを利用して、ファイルへの書き込みとファイルからの読み取りを行うことができます。このチュートリアルでは、INI
ファイルを表すクラスを作成し、WindowsAPI 操作でそれらを操作します。
INI
ファイルを操作するには、WritePrivateProfileString
と ReadPrivateProfileString
の 2つの WindowsAPI 関数が必要です。
WritePrivateProfileString
を使用して、新規および変更された設定を C#
の INI ファイルに保存する
INI
ファイルでは、WritePrivateProfileString
が新規および変更された設定を保存します。構成は以下のとおりです。
bool WritePrivateProfileString(string name, string key, string value, string filepath);
この関数は、書き込みが成功した場合は true、書き込みが失敗した場合は false のブール結果を返します。以下はパラメータです。
- 書き込むセクションの名前は、
name
で指定されます。 - 設定するキーの名前は
key
で指定します。 - キーの値は
value
で指定されます。 filepath
は、更新されるINI
ファイルの場所を保持します。
C#
で ReadPrivateProfileString
を使用して INI ファイルからデータを読み取ります
ReadPrivateProfileString
は INI
ファイルからデータを読み取ります。この関数は、アプリケーションに応じて、単一の値、セクションからのすべてのキー名、またはすべてのセクション名を読み取ります。
int GetPrivateProfileString(string name, string key, string default, StringBuilder ReturnedVal,
int maxsize, string filepath);
戻り値の文字数は、関数によって符号なし整数として返されます。以下はパラメータです。
- 読み取るセクションの名前は
name
で指定されます。これが null に設定されている場合、すべてのセクション名が返されます。 - 読み取るキーの名前は
key
で指定されます。name
が null でないときに null に設定すると、戻り値には指定されたセクションのキーの名前が含まれます。 - キーが存在しない場合、
default
は返すデフォルト値を指定します。 ReturnedVal
は、バッファとして機能する文字列を受け取ります。操作の結果はバッファに書き込まれ、文字列の値を変更します。ReturnedVal
で返される文字列の最大サイズは、maxsize
で指定されます。これは、バッファサイズと同じである必要があります。INI
ファイルから読み取られた値がReturnedVal
より長い場合、値は減少します。- 読み取る
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();
}
}
}
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