간단한 애플리케이션의 설정 정보를 저장하고 관리하기 위해 INI 파일을 사용하는 경우가 있습니다. Windows 운영체제는 이러한 INI 파일을 직접 처리할 수 있는 API를 제공하며, C#에서는 P/Invoke를 통해 이러한 API를 호출할 수 있습니다. 이 방법을 사용하면 별도의 라이브러리 없이 기본적인 설정 파일 기능을 구현할 수 있습니다.
Windows API를 통해 INI 파일을 읽고 쓰기 위해서는 kernel32.dll 라이브러리에 포함된 두 가지 핵심 함수를 사용합니다. 이 함수들은 각각 GetPrivateProfileString과 WritePrivateProfileString입니다.
// Windows API에서 제공하는 설정 파일 읽기 함수
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern uint GetPrivateProfileString(
string lpAppName, // 섹션 이름
string lpKeyName, // 키 이름
string lpDefault, // 기본값
StringBuilder lpReturnedString, // 반환될 값이 저장될 StringBuilder
uint nSize, // 반환될 값의 최대 크기
string lpFileName); // 설정 파일 경로
// Windows API에서 제공하는 설정 파일 쓰기 함수
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern uint WritePrivateProfileString(
string lpAppName, // 섹션 이름
string lpKeyName, // 키 이름
string lpString, // 저장할 값
string lpFileName); // 설정 파일 경로
이 함수들을 C#에서 사용하기 위한 래퍼(Wrapper) 메서드를 작성하면 편리하게 사용할 수 있습니다. 아래는 파일 경로를 자동으로 처리하고, 값을 읽고 쓰는 간단한 헬퍼 클래스의 예시입니다.
public static class IniFileHelper
{
public static void WriteConfigValue(string section, string key, string value)
{
string configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app_config.ini");
WritePrivateProfileString(section, key, value, configFilePath);
}
public static string ReadConfigValue(string section, string key)
{
StringBuilder result = new StringBuilder(512);
string configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app_config.ini");
GetPrivateProfileString(section, key, "기본값", result, (uint)result.Capacity, configFilePath);
return result.ToString();
}
}
이 헬퍼 클래스를 사용하여 Windows Forms 애플리케이션에서 설정 파일을 관리하는 예제를 살펴보겠습니다. 이 예제에서는 프로그램이 시작될 때 설정 파일에 '보레이트' 값을 기록하고, 버튼을 클릭하면 해당 값을 읽어와 텍스트 상자에 표시합니다.
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace ConfigFileExampleApp
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
// Windows API 함수 선언 (위의 코드와 동일)
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern uint GetPrivateProfileString(...);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern uint WritePrivateProfileString(...);
private void MainForm_Load(object sender, EventArgs e)
{
// 프로그램 시작 시 설정 파일에 기본값 기록
IniFileHelper.WriteConfigValue("설정", "보레이트", "9600");
}
private void 표시버튼_Click(object sender, EventArgs e)
{
// 설정 파일에서 값 읽어와 텍스트 박스에 표시
보레이트TextBox.Text = IniFileHelper.ReadConfigValue("설정", "보레이트");
}
}
}