본문 바로가기

프로그램/유니티 스크립트 소스

[유니티 스크립트 소스] ini 파일 읽고 쓰기

728x90
반응형

ini 파일 읽고 쓰는 소스입니다.

 

1. 소스

1.1 네임스페이스

 

네임스페이스
using System.Runtime.InteropServices; 
using System.Text; 
using System.IO; 

 

 

1.2 DllImport

 

ini 읽고, 쓰기 위해서는 C++의 kernel32.dll의 WritePrivateProfileString 함수와 GetPrivateProfileString 함수를 사용합니다.

그렇기 때문에 DllImport 속성(Atattribute)를 사용하여 dll 선언과 함수 선언을 합니다.

 

DllImport
[DllImport("kernel32", CharSet = CharSet.Unicode)]
static extern long WritePrivateProfileString(
        string Section, string Key, string Value, string FilePath);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
static extern int GetPrivateProfileString(
    string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

 

 

1.3 메서드

 

메서드 : ini 파일 읽기
public string ReadIni(string filePath, string section, string key)
{
    var value = new StringBuilder(255);
    GetPrivateProfileString(section, key, "Error", value, 255, filePath);
    return value.ToString();
}

 

메서드 : ini 파일 쓰기
public void WriteIni(string filePath, string section, string key, string value)
{
    WritePrivateProfileString(section, key, value, filePath);
}

 

1.4 ini 파일

ini 파일
[Section]
BoolData=True
IntData=1
FloatData=23.4
StringData=String

 

ini 파일에서 [Section]은 section이고, BoolData, IntData ...은 key입니다.

=다음에 오는 True value입니다.

ini 파일에서 주석은  ;(세미클론)입니다.

 

2. 데모

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

public class DemoIniFile : MonoBehaviour 
{ 
    [DllImport("kernel32", CharSet = CharSet.Unicode)] 
    static extern long WritePrivateProfileString( 
          string Section, string Key, string Value, string FilePath); 
    [DllImport("kernel32", CharSet = CharSet.Unicode)] 
    static extern int GetPrivateProfileString( 
        string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); 

    [Header("Write")] 
    public bool m_WriteBoolData; 
    public int m_WriteIntData; 
    public float m_WriteFloatData; 
    public string m_WriteStringData; 

    [Header("Read")] 
    public bool m_ReadBoolData; 
    public int m_ReadIntData; 
    public float m_ReadFloatData; 
    public string m_ReadStringData; 

    void Update() 
    { 
        if (Input.GetKeyDown(KeyCode.W)) 
        { 
            string filePath = Path.Combine(Application.streamingAssetsPath, "config.ini"); 

            WriteIni(filePath, "Section", "BoolData", m_WriteBoolData.ToString()); 
            WriteIni(filePath, "Section", "IntData", m_WriteIntData.ToString()); 
            WriteIni(filePath, "Section", "FloatData", m_WriteFloatData.ToString()); 
            WriteIni(filePath, "Section", "StringData", m_WriteStringData.ToString()); 
        } 

        if (Input.GetKeyDown(KeyCode.R)) 
        { 
            string filePath = Path.Combine(Application.streamingAssetsPath, "config.ini"); 

            string boolData = ReadIni(filePath, "Section", "BoolData"); 
            bool.TryParse(boolData, out m_ReadBoolData); 

            string intData = ReadIni(filePath, "Section", "IntData"); 
            int.TryParse(intData, out m_ReadIntData); 

            string floatData = ReadIni(filePath, "Section", "FloatData"); 
            float.TryParse(floatData, out m_ReadFloatData); 

            string doubleData = ReadIni(filePath, "Section", "DoubleData"); 
        } 
    } 

    public void WriteIni(string filePath, string section, string key, string value) 
    { 
        WritePrivateProfileString(section, key, value, filePath); 
    } 

    public string ReadIni(string filePath, string section, string key) 
    { 
        var value = new StringBuilder(255); 
        GetPrivateProfileString(section, key, "Error", value, 255, filePath); 
        return value.ToString(); 
    } 
}

 

728x90
반응형