C#에서 INI 파일 읽기 및 쓰기

Muhammad Zeeshan 2023년10월12일
  1. C#INI 파일이란?
  2. WritePrivateProfileString을 사용하여 C#의 INI 파일에 새 설정 및 수정된 설정 저장
  3. ReadPrivateProfileString을 사용하여 C#의 INI 파일에서 데이터 읽기
  4. C#에서 INI 파일 읽기 및 쓰기
C#에서 INI 파일 읽기 및 쓰기

이 튜토리얼은 C#에서 INI 파일을 읽고 쓰는 방법을 가르칩니다.

C#INI 파일이란?

INI 파일이라고 하는 초기화 파일은 프로그램 구성 정보를 저장하기 위한 텍스트 파일입니다. .NET 프레임워크는 기본적으로 INI 파일을 지원하지 않습니다.

플랫폼 호출 서비스를 사용하여 Windows API 메서드를 활용하여 파일에 쓰고 읽을 수 있습니다. 이 튜토리얼은 INI 파일을 나타내는 클래스를 구성하고 Windows API 작업으로 조작합니다.

INI 파일로 작업하려면 WritePrivateProfileStringReadPrivateProfileString의 두 가지 Windows API 함수가 필요합니다.

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 파일의 위치가 있습니다.

ReadPrivateProfileString을 사용하여 C#의 INI 파일에서 데이터 읽기

ReadPrivateProfileStringINI 파일에서 데이터를 읽습니다. 이 함수는 애플리케이션에 따라 단일 값, 섹션의 모든 키 이름 또는 모든 섹션 이름을 읽습니다.

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

반환된 값의 문자 수는 함수에서 부호 없는 정수로 반환됩니다. 다음은 매개변수입니다.

  1. 읽을 섹션의 이름은 이름으로 지정됩니다. null로 설정하면 모든 섹션 이름이 반환됩니다.
  2. 읽을 키의 이름은 key로 지정됩니다. 반환된 값은 name이 null이 아닌 동안 null로 설정된 경우 지정된 섹션의 키 이름을 포함합니다.
  3. 키가 없으면 default는 반환할 기본값을 지정합니다.
  4. ReturnedVal은 버퍼 역할을 하는 문자열을 수신합니다. 작업 결과는 버퍼에 기록되어 문자열 값을 수정합니다.
  5. ReturnedVal에 반환될 문자열의 최대 크기는 maxsize로 지정됩니다. 이것은 버퍼 크기와 같아야 합니다. INI 파일에서 읽은 값이 ReturnedVal보다 길면 감소됩니다.
  6. 읽을 INI 파일의 위치와 이름은 filepath로 지정됩니다. 이 파일이 있어야 합니다.

C#에서 INI 파일 읽기 및 쓰기

구조를 보았으므로 이제 사용할 Windows API 함수의 구조를 보유할 클래스를 만들어 보겠습니다.

다음 라이브러리를 추가합니다.

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

ReadWriteINIfile이라는 새 클래스를 만들고 다음 클래스 코드를 사용합니다. 클래스 자체에 대한 액세스 수정자가 없기 때문에 내부 범위가 있습니다.

IniFile 클래스는 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;
}

WritePrivateProfileStringINI 파일을 값으로 채우는 데 사용됩니다. 아래 코드에서는 세 개의 인수를 사용하여 섹션 및 키 이름과 저장할 값을 승인합니다.

WritePrivateProfileString 호출에서 이러한 값은 생성자에 전달된 파일 이름과 결합됩니다.

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

ReadINI에 대한 인수는 읽을 namekey입니다. 위 코드의 첫 번째 줄은 문자열을 정의하고 그 값을 최대 길이와 동일한 여러 공백으로 설정합니다.

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