C#

[ini] C# ini 파일 조회/저장/수정. (ini파일에 대하여)

C#Developer 2021. 7. 26. 11:43

안녕하세요. 회원여러분.
오늘은 C#의 ini파일 조회/저장/수정에 대해 알아보겠습니다.

1. ini파일이란?
  응용프로그램 실행시 필요한 초기 정보를 가지고 있는 파일로써, 아스키 파일로 구성되어 있어 일반 텍스트 편집기(메모장 등)로
  수정할 수 있습니다.

2. ini파일의 사용 목적.
  2.1 사용자가 해당 응용프로그램을 통해 마지막으로 입력(등록)한 정보를 저장하고, 실행시 출력하도록 사용할 수 있습니다.
  2.2 또한 응용프로그램의 수정을 최소화 목적으로 사용할 수 있습니다. 
       예를들어 응용프로그램에 특정값을 하드코딩할 경우 ini파일에 저장하여 값 수정시 ini파일 수정/재배포를 통해 
       응용프로그램의 수정을 최소화할 수 있습니다.

3. ini파일의 구성.
  색션(Section), 키(Key), 값(Value)으로 구성되어 있으며, 응용프로그램은 색션(Section)-키(Key)의 값(Value)을 저장/수정/조회
  합니다.

4. C#으로 ini파일 조회/저장/수정.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//해당 코드 추가.
using System.Runtime.InteropServices;

namespace iniFileTest
{

    public partial class Form1 : Form
    {
        private string _iniPath = Application.StartupPath + @"\\test.ini";

        /// <summary>
        /// ini파일의 색션(Section)-키(Key)의 값(Value)을 조회(가져오기).
        /// </summary>
        /// <param name="section">색션(Section)</param>
        /// <param name="key">키(Key)</param>
        /// <param name="def"></param>
        /// <param name="retVal"></param>
        /// <param name="size"></param>
        /// <param name="filePath"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

        /// <summary>
        /// ini파일의 색션(Section)-키(Key)의 값(Value)을 저장/수정.
        /// </summary>
        /// <param name="section"></param>
        /// <param name="key"></param>
        /// <param name="val"></param>
        /// <param name="filePath"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        private static extern int WritePrivateProfileString(string section, string key, string val, string filePath);

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// GetPrivateProfileString()함수를 사용하여 ini파일의 색션(Section)-키(Key)의 값(Value)을 조회(가져오기).
        /// 
        /// 이 함수를 사용하는 이유는 GetPrivateProfileString()함수는 값(Value)을 StringBuilder클래스 형태로 반환하는데
        /// 개인적으로 StringBuilder클래스보다 string 형태로 반환하는 것이 사용하는데 더 용이하기 때문.
        /// </summary>
        /// <param name="section">색션</param>
        /// <param name="key">키</param>
        /// <param name="valueCapacity">ini파일에 저장된 값 크기. StringBuilder클래스는 값의 크기를 선언해야 하며, ini파일에 저장된 색션(Section)-키(Key)의 값(Value)에 따라 선언해야 된다.</param>
        /// <param name="filePath">ini파일 위치.</param>
        /// <returns></returns>
        public string GetIniValue(string section, string key, int valueCapacity, string filePath)
        {

            string ReturnValue;
            StringBuilder tmp = new StringBuilder(255);

            int i = GetPrivateProfileString(section, key, "", tmp, 255, filePath);

            ReturnValue = tmp.ToString();

            return ReturnValue;
        }

        /// <summary>
        /// WritePrivateProfileString()함수를 사용하여 ini파일의 색션(Section)-키(Key)의 값(Value)을 저장/수정.
        /// </summary>
        /// <param name="section">색션</param>
        /// <param name="key">키</param>
        /// <param name="value">저장/수정하려는 값</param>
        /// <param name="filePath">ini파일 위치.</param>
        public static void SetIniValue(string section, string key, string value, string filePath)
        {
            WritePrivateProfileString(section, key, value, filePath);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            GetIniValues();
        }

        private void btnSaveFruit_Click(object sender, EventArgs e)
        {
            SetIniValue("Fruit", "001", txtFruit_001.Text, _iniPath);
            SetIniValue("Fruit", "002", txtFruit_002.Text, _iniPath);
            SetIniValue("Fruit", "003", txtFruit_003.Text, _iniPath);
        }

        private void btnSaveCar_Click(object sender, EventArgs e)
        {
            SetIniValue("Car", "001", txtCar_001.Text, _iniPath);
            SetIniValue("Car", "002", txtCar_002.Text, _iniPath);
            SetIniValue("Car", "003", txtCar_003.Text, _iniPath);
        }

        private void GetIniValues()
        {
            txtFruit_001.Text = GetIniValue("Fruit", "001", 30, _iniPath);
            txtFruit_002.Text = GetIniValue("Fruit", "002", 30, _iniPath);
            txtFruit_003.Text = GetIniValue("Fruit", "003", 30, _iniPath);

            txtCar_001.Text = GetIniValue("Car", "001", 30, _iniPath);
            txtCar_002.Text = GetIniValue("Car", "002", 30, _iniPath);
            txtCar_003.Text = GetIniValue("Car", "003", 30, _iniPath);
        }
    }
}

 

위 소스코드를 실행하면 다음과 같습니다.


  ini파일 조회/저장/수정 경로는 _iniPath 변수로 선언하였습니다. 
  현재 ini파일의 저장위치는 다음과 같습니다.


  만약 저장/수정시 선언된 경로에 ini파일이 없다면, WritePrivateProfileString()함수에서 자동 생성합니다.
  
  프로그램 실행 시 FormLoad()이벤트에 GetIniValues()를 사용하여 저장된 ini파일의 값을 조회하여 해당 컨트롤에 출력

  합니다.

  ini파일을 직접 실행하면 다음과 같습니다.
 

ini파일 구조.

  ini파일를 보면 색션(Section)-키(Key)의 값을 확인할 수 있습니다.

 

iniFileTest.zip
0.45MB


  위 소스코드의 프로젝트도 같이 올려드리니 참고하시기 바랍니다.
  이상 사이버지식정보방이었습니다.