[C#] ini 파일 읽기 및 쓰기: kernel32 사용하지 않고

Wookoa 2024. 4. 17.

ini 파일 읽기 및 쓰기 Kernel32 미사용
ini 파일 읽기 및 쓰기 Kernel32 미사용

머리말

  프로그램을 개발하다 보면 사용자 환경을 저장하는 설정 파일을 읽거나 쓰는 경우가 발생한다. 그중 많이 사용되는 방법 중 하나가 .ini 파일을 사용하는 방법이며 .ini 파일은 일정한 문법적인 구조에 따라 작성하게 된다. 물론 아직도 레지스트리에 프로그램의 설정을 저장하는 방법도 많이 사용되지만 Window 운영체제의 보안 강화로 인해 레지스트리의 접근은 더 이상 자유롭지 못하다. 본인은 이러한 이유로 .ini 파일을 사용해서 사용자 설정 파일을 구성하는 방법을 더 선호한다. 본 포스팅은 .ini 파일을 작성하고 읽어 들이는 두 가지 방법에 대해서 소개한다.

kernel32 사용하는 방법

  C# 언어로 프로그램을 개발하는 데 있어서 WIN API를 사용하는 것은 그다지 반갑지 않다. 하지만 무작정 피해 갈 수도 없는 노릇이다. 본인은 가급적 피해 갈 수 있는 방향으로 개발을 하지만 어쩔 수 없는 경우도 존재한다. 그렇기 때문에 권장하지는 않지만 kernel32.dll을 사용해서 .ini 파일을 읽고 쓰는 방법을 소개한다. 자신의 프로그램이 다른 이유로 Kernel32.dll을 이미 사용 중이라면 고려해 볼 만한 방법일 수 있다.

using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // ini 쓰기
            WritePrivateProfileString("WookoaSetting", "TopAlways", "true", "C:\\Setting.ini");
            WritePrivateProfileString("WookoaSetting", "ViewTray", "false", "C:\\Setting.ini");

            // ini 읽기
            StringBuilder topAlways = new StringBuilder();
            StringBuilder ViewTray = new StringBuilder();

            GetPrivateProfileString("WookoaSetting", "TopAlways", "", topAlways, topAlways.Capacity, "C:\\Setting.ini");
            GetPrivateProfileString("WookoaSetting", "ViewTray", "", ViewTray, ViewTray.Capacity, "C:\\Setting.ini");
        }

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, 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);
    }
}

  위와 같이 코드는 간단하다. kernel32.dll 파일을 코드의 하단부와 같이 Import 해준 뒤 선언한 메서드를 활용해서 읽고 쓰면 된다. 지정한 경로에 생성된 Setting.ini 파일을 열어보면 아래와 같이 생성된 것을 확인할 수 있다. 동일한 방법으로 지정된 경로의 파일을 읽어 들여서 프로그램에 활용할 수 있다. 자신의 프로젝트에 적용해 보면 어렵지 않게 빌드할 수 있다.

지정된 경로에 생성된 Setting.ini 파일
지정된 경로에 생성된 Setting.ini 파일

Kernel32 사용하지 않는 방법

  WIN API를 사용하지 않는 방법은 의외로 단순하고 직관적이다. 파일을 StreamReader 객체로 읽어 들여서 파싱 하면 끝이다. C# 언어에서 지원하는 파일 관련 객체를 이용하는 방법이라 프로그램이 간결해질 수 있다. 하지만 파일을 직접 생성하고 읽어 들이는 등의 파싱을 직접 할 필요도 없다. 이미 오픈소스에 괜찮은 소스가 많이 올라왔다. 그 중 본인이 자주 사용하는 오픈소스를 소개한다.

Github: https://github.com/Enichan/Ini

Ini.cs

  Github 경로에 공개된 저장소에서 다운로드해도 되며 포스팅을 작성한 시점의 버전을 첨부 파일로 공유했으니 참고하면 좋다. 먼저 다운로드한 Ini.cs 소스를 자신의 프로젝트에 아래와 같이 추가한다.

오픈소스를 자신의 프로젝트에 추가
오픈소스를 자신의 프로젝트에 추가

  추가한 Ini.cs 파일을 아래와 같이 오브젝트를 선언 후, 제공되는 메서드를 통해 사용자 설정 값을 아래와 같이 쓰기/읽기를 수행할 수 있다. 생성한 객체에 브래킷을 사용하는 방법이라 직관적으로 프로그래밍이 가능하다는 장점이 있다.

using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // ini 쓰기
            IniFile ini = new IniFile();
            ini["WookoaSetting"]["TopAlways"] = "true";
            ini["WookoaSetting"]["ViewTray"] = "false";
            ini.Save("C:\\Setting.ini");

            // ini 읽기
            ini.Load("C:\\Setting.ini");
            string topAlways = ini["WookoaSetting"]["TopAlways"].ToString();
            string ViewTray = ini["WookoaSetting"]["ViewTray"].ToString();
        }
    }
}

  Github에 공유된 가볍고 좋은 소스를 통해 매우 간결하고 직관적으로 프로그래밍할 수 있다. 지정한 경로에 생성된 Setting.ini 파일을 열어보면 동일한 결과물을 얻을 수 있으며, 반대의 방법으로 읽어진 변수 값을 메시지 박스로 확인해 보면 정상적으로 값이 읽어지는 것을 확인할 수 있다.

꼬리말

  포스팅이 작성된 지 4년이 지난 시점에 리뉴얼을 했다. 본인도 가끔 C# 프로그래밍을 할 때에는 본 포스팅에서 설명한 오픈소스를 활용해서 사용자 설정 파일을 생성하고 관리한다. 코드를 그대로 오픈해서 아직까지 많은 개발자들이 찾게 되는 오픈소스라 생각된다. 앞으로도 많은 블로그 방문자가 본 포스팅을 통해 도움을 받았으면 하는 욕심을 적으면서 본 포스팅을 마치도록 한다.

인기있는 글

소중한 댓글 (0)