우당탕탕 타우리 #006💬 INI 파일 가지고 놀기
포스트
취소

우당탕탕 타우리 #006💬 INI 파일 가지고 놀기

HitCount


Contents


INI

INI 파일은 보통 프로그램의 실행에 필요한 설정과 관련한 정보를 저장하기 위한 목적으로 생성된 텍스트 문서를 말합니다.

INI 파일 관리

Cargo.toml 파일을 열어 ini 파일을 관리하기 위해 이미 충분히 검증된 rust-ini 크레이트를 아래와 같이 추가합니다.

1
2
3
[dependencies]
...
rust-ini = "0.19.0"

이제 main.rs의 소스를 열어,

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
31
32
33
34
35
36
37
38
39
40
41
42
43
use std::io::stdout;
use ini::Ini;

const CONF_FILE_NAME: &str = "conf.ini";

fn main() {
    let mut conf = Ini::new();
    conf.with_section(None::<String>).set("encoding", "utf-8");
    conf.with_section(Some("User"))
        .set("name", "✔monoslab")
        .set("value", "Pi");
    conf.with_section(Some("Library"))
        .set("name", "홍길동")
        .set("location", "대한민국\x0a서울");

    conf.section_mut(Some("Library")).unwrap().insert("seats", "100");

    println!("---------------------------------------");
    println!("Writing to file {:?}\n", CONF_FILE_NAME);
    conf.write_to(&mut stdout()).unwrap();

    conf.write_to_file(CONF_FILE_NAME).unwrap();

    println!("----------------------------------------");
    println!("Reading from file {:?}", CONF_FILE_NAME);
    let ini_file = Ini::load_from_file(CONF_FILE_NAME).unwrap();

    println!("Iterating");
    let general_section_name = "";
    for (sec, prop) in ini_file.iter() {
        let section_name = sec.as_ref().unwrap_or(&general_section_name);
        println!("● Section: {:?} begins", section_name);
        for (k, v) in prop.iter() {
            println!("{}: {:?}", k, v);
        }
    }
    println!();

    let section = ini_file.section(Some("User")).unwrap();
    println!("name={}", section.get("name").unwrap());
    println!("conf[User][name]={}", &ini_file["User"]["name"]);
    println!("General Section: {:?}", ini_file.general_section());
}

아래는 위의 코드를 실행시켜 얻은 결과 값입니다.

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
----------------------------------------
Writing to file "conf.ini"

encoding=utf-8

[User]
name=✔monoslab
value=Pi

[Library]
name=홍길동
location=대한민국\n서울
seats=100
----------------------------------------
Reading from file "conf.ini"
Iterating
● Section: "_Default_"
encoding: "utf-8"
● Section: "User"
name: "✔monoslab"
value: "Pi"
● Section: "Library"
name: "홍길동"
location: "대한민국\n서울"
seats: "100"

name=✔monoslab
conf[User][name]=✔monoslab
General Section: Properties { data: {"encoding": "utf-8"} }

ini 파일 생성(쓰기)

위의 예제에 코드에서 주요 내용을 살펴보면,

1
2
use std::io::stdout;
use ini::Ini;

먼저 파일을 읽고 쓰기 위해 러스트의 기본 패키지인 std::io::stdout을 사용하였고, ini 파일의 내용을 파싱하기 위해 ini::Ini를 사용하겠다고 정의하였습니다.

1
2
3
4
5
6
let mut conf = Ini::new();
conf.with_section(None::<String>).set("encoding", "utf-8");
...
conf.section_mut(Some("Library")).unwrap().insert("seats", "100");
conf.write_to(&mut stdout()).unwrap();
conf.write_to_file(CONF_FILE_NAME).unwrap();

위의 코드는
뮤터블(mutable)한 Ini 객체를 생성하고,

  • win_section 메소드로 섹션 설정
  • set 메소드를 이용하여 key와 value값을 설정

합니다.
그리고 Ini 객체에 또 다른 섹션과 key, value 값을 설정하기 위해

  • section_mut 메소드로 섹션 추가
  • insert 메소드로 key, value 값을 추가

합니다.
write_to 메소드와 write_to_file 메소드는 각각 콘솔창과 파일로 ini 객체의 내용을 출력하는 방법입니다.

ini 파일 읽기

1
2
3
4
5
6
let ini_file = Ini::load_from_file(CONF_FILE_NAME).unwrap();
...
let section = ini_file.section(Some("User")).unwrap();
println!("name={}", section.get("name").unwrap());
println!("conf[User][name]={}", &ini_file["User"]["name"]);
println!("General Section: {:?}", ini_file.general_section());

위의 코드는 load_from_file 메소드로 파일을 읽어와서 section 메소드를 이용하여 읽어 올 섹션을 정의하고 get 메소드에 key값을 넘겨주어 해당 key값의 데이터를 넘겨 받는 예 입니다. (ini_file.section(…).get(…))
메소드를 이용하지 않고 &ini_file["User"]["name"]과 같이 바로 섹션명과 키값을 주어 value 값을 가져올 수도 있습니다. 마지막으로 general_section 메소드는 섹션이 설정되지 않은 항목을 json 포맷으로 읽어 옵니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.