본문 바로가기
Program/C# .NET

[WPF / C#] 프로그램 설정 파일 관리하기 / ini파일 설정 / 프로그램 변수 외부 관리

by 냠만 2024. 3. 30.

[프로그램 변수 설정]

프로그램에서는 변수를 어떻게 관리하는지에 따라 유지보수 용이성이 상승하기도 하고 극악으로 치닫기도 합니다. 특정 변수의 값을 프로그램에서 제어하게 되면 하드코딩하게 되어 변수의 값을 변경할 때마다 프로그래머에게 요청하여 소스의 값을 수정하고 다시 빌드하여 패치를 진행해야 합니다.

 

위 상황을 방지하기 위해 별도 설정파일을 관리하고 프로그램 시작시에나 특정 트리거가 발생할 때 해당 설정파일을 읽어와서 클래스 변수를 세팅하고 시퀀스를 진행하게 됩니다.

 

일반적으로 txt파일로 관리를 진행하지만 순서에 따른 유지보수가 어렵기 때문에 ini 파일로 관리하게 됩니다. txt파일로 관리할 시 항목을 추가하고 싶을 때 순서를 지켜야 하며, 순서가 꼬일 경우 프로그램에서 추가 작업이 필요하기 때문에 유지보수가 번거롭기 때문입니다.

ini 파일은 관리하기 쉽도록 [Section]과 [Key]값으로 구분자가 확실하게 존재하고, 해당 값을 참조하여 데이터베이스처럼 관리가 가능합니다.

특정 Section에 Key를 추가하기도 용이하고 반대로 삭제도 용이해서 순서로 꼬일 걱정은 전혀 하지 않아도 된다는 장점이 있습니다. 다만 새로운 Key를 추가하여 프로그램에서 변수를 관리하고자 할 때에는 똑같이 소스를 수정해야 하는 점은 동일하지만 데이터베이스 방식이라 관리가 용이한 점은 부정할 수 없는 큰 장점이라고 생각합니다.

[ini 파일 읽기 쓰기]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class IniParser
{
    public static string _path { get => @"C:\Users\Yang\source\repos\Settings.ini"; }
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string Section, string Key, string Def, StringBuilder RetValue, int Size, string FilePath);
 
 
    public string ReadData(string path, string section, string key, bool isnumbberic = false)
    {
        StringBuilder Strings = new StringBuilder();
        var Errors = GetPrivateProfileString(section, key, "", Strings, 4096, path);
 
        if (Strings.ToString() == "")
        {
            if (isnumbberic == true)
            {
                return "0";
            }
        }
        return Strings.ToString();
    }
 
 
    public void WriteData(string path, string Section, string Key, string Value)
    {
        WritePrivateProfileString(Section, Key, Value, path);
    }
}
cs

파일 읽고쓰는 로직입니다. 파일 경로는 사용자에 따라 커스터마이징 하시면 될 것 같습니다.

우선 예시로 사용하기 위해 Static으로 구성을 안 했지만 재량에 따라 Static으로 사용하셔도 되고 경로를 분리하여 IniParser Class 객체로 활용하셔도 될 것 같습니다.

 

파일을 읽고 쓴 결과입니다. 첫 번째로 Section을 참조하여 Name이라는 Key값을 읽어와서 콘솔에 정상적으로 값이 출력된 걸 확인할 수 있습니다.

두 번째로 Section Count에 Key값 Total을 입력하여 해당 Value를 123으로 설정한 케이스입니다. 경로의 Setting.ini 파일에 정상적으로 작성된 걸 확인할 수 있으며, 해당값을 읽어왔을 때 Value가 일치하는 걸 확인할 수 있습니다.

[결론]

위 방법은 존재하는 Section 및 Key값을 참조하여 특정 변수에 값을 참조시키는 방법 입니다. 한 개씩 적용할 수 있기 때문에 전역변수나 공용으로 사용되는 파일 경로 등 일반적인 구조에서 사용 시 용이합니다.

 

반면 프로그램을 제어하다 보면 레시피같은 특정 상황에 필요한 변수를 여러 번 교체하여 사용해야 되는 경우가 있습니다. 이때 동일 소스가 중복되는 케이스가 많이 발생되므로 이를 방지하는 방법이 존재합니다.

바로 ini파일에 존재하는 항목을 Class 객체로 한번에한 번에 읽어올 수 있고, 반대로 객체에 존재하는 모든 변수를 Section과 Key값으로 구분해 한번에 작성하는 방법입니다.

 

위의 방법은 추가 포스팅으로 소개하도록 하겠습니다.