공통 [팁] TIniFile과 TMemIniFile 사용

2019.12.04 09:45

험프리 조회 수:1464

Ini 파일 형식은 손쉽게 구성 정보를 기록할 수 있는 포맷으로 많은 곳에서 사용되고 있습니다. Ini 파일 형식은 파일을 이용해 정보를 저장해 플랫폼 종속적이지 않게 구성 정보를 관리할 수 있습니다.

 

Ini 파일은 윈도우는 물론 안드로이드, iOS, macOS, 리눅스에서도 사용할 수 있습니다.

 

RTL(RunTime Library)에서는 ini 파일 읽기와 쓰기를 간단히 할 수 있는 TIniFile과 TIniMemFile이 준비되어 있습니다.

 

TIniFile은 디스크 상의 Ini 파일을 매번 읽고 쓰지만, TMemIniFile은 생성 시 정보를 읽고, 버퍼(메모리)에 정보를 기록하는 차이가 있습니다.

 

TIniFile과 TMemIniFile은 개체 생성 시 생성자의 파라메터로 파일 경로를 전달합니다. 이 파일이 존재하지 않으면 자동으로 파일을 생성합니다.

이후 ReadString, ReadInteger, ReadDate, ReadBool 등의 다양한 메소드로 구성 정보를 읽습니다. 또는 ReadSection 메소드를 사용 섹션의 전체 정보를 읽을 수 있습니다. 마찬가지로 WriteString, WriteInteger, WriteDate, WriteBool 등의 메소드로 구성정보를 기록합니다.

 

다음 예제에서는 Ini 파일을 이용, 종료시 폼 위치를 폼 생성시 지정하는 내용을 구현할 수 있습니다.

 

Delphi:

 
 procedure TForm1.FormCreate(Sender: TObject);
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
     Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
     Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
     if Ini.ReadBool( 'Form', 'InitMax', false ) then
       WindowState := wsMaximized
     else
       WindowState := wsNormal;
   finally
     Ini.Free;
   end;
 end;
 
 procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Ini.WriteInteger( 'Form', 'Top', Top);
     Ini.WriteInteger( 'Form', 'Left', Left);
     Ini.WriteString( 'Form', 'Caption', Caption );
     Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
   finally
     Ini.Free;
   end;
 end;

C++:

 __fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)
 {
    TIniFile *ini;
    ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
    Top    =  ini->ReadInteger( "Form", "Top", 100 );
    Left   =  ini->ReadInteger( "Form", "Left", 100 ); 
    Caption = ini->ReadString ( "Form", "Caption", "Default Caption" );
    ini->ReadBool( "Form", "initMax", false ) ?
          WindowState = wsMaximized :
          WindowState = wsNormal;

    delete ini;
  }

  void __fastcall TForm1::FormClose)TObject *Sender, TCloseAction &Action)
  {
    TIniFile *ini;
    ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
    ini->WriteInteger( "Form", "Top", Top );
    ini->WriteInteger( "Form", "Left", Left );
    ini->WriteString ( "Form", "Caption", Caption );
    ini->WriteBool   ( "Form", "InitMax", WindowState == wsMaximized );

  delete ini;
  }

ReadInteger 메소드의 파라메터는 "섹션, 키, 기본값"으로 파일이 없거나, 섹션 또는 키가 없을 경우 기본값을 반환합니다.

WriteInteger 메소드도 섹션과 키를 지정해 구성을 저장합니다.

 

다음과 같이 Ini 파일이 기록됩니다.

[Form]
Top=100
Left=100
Caption=Default Caption
InitMax=0

 

TMemIniFile은 생성자(Create 메소드)를 통해 IniFile의 정보를 가져와 버퍼(메모리)에 저장 후 메모리를 이용 구성을 관리합니다.

프로그램 생성 후 메모리 상에서만 구성을 관리할때 유용합니다.

 

버퍼 상의 정보를 기록하려면 UpdateFile 메소드를 호출하면 됩니다. 

만약, 종료 이전 UpdateFile 메소드를 호출하지 않으면 버퍼상의 정보는 저장되지 않습니다. 이 정보의 누락을 방지하려면 AutoSave 속성을 True로 지정해 자동저장 할 수 있습니다.

 

마지막으로, TRegistryIniFile 은 윈도우 레지스트리에 구성정보를 기록할 수 있는 클래스입니다.

다음과 같이 레지스트리 경로를 지정해 TIniFile과 동일하게 사용 가능합니다.

{ Registry mode selected: in HKEY_CURRENT_USER\Software\... }
IniFile := TRegistryIniFile.Create('Software\' + Application.Title);

참고자료


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15465
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13970
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16505
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22061
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23270
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18932
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39265
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174728
534 퀵레포트 보고서 엑셀로 내보내기(저장하기) [1] 험프리 2016.08.01 1665
533 [20140610 온라인 세미나 발표자료] 처음 만나는: RAD Studio XE6, Delphi XE6, C++Builder XE6 file 관리자 2014.06.14 1652
532 [XE8] 대화형 지도 컴포넌트로 구글맵과 애플 맵킷 한번에 사용하기 Humphery 2015.04.17 1650
531 RAD 스튜디오 - 사물인터넷 관련기술과 고객사례 험프리 2017.10.31 1644
530 코드 아카데미: 세션1. BaaS와 Kinvey 자세히 알아보기(2014.7.29) 관리자 2014.07.30 1634
529 [RAD서버] EMS 패키지 프로젝트 시작하기 험프리 2017.04.28 1630
528 [10.4 프리뷰] 베타 서비스 시작 & 새 기능 미리 보기 관리자 2020.03.03 1613
527 C++빌더와 델파이를 이용한 SHA 해시 file 김원경 2018.05.21 1609
526 코드 아카데미: 세션3. 클라우드 기반 스토리지 (2014.8.12) 관리자 2014.08.18 1586
525 [FireDAC Skill Sprints] 1. FireDAC 소개 험프리 2015.04.01 1582
524 [코드레이지11] 인공지능(AI) with 델파이 & C++빌더 - Boian Mitov [1] 험프리 2016.11.24 1581
523 나의 첫 윈도우/맥 애플리케이션 개발하기: 파이어몽키 코스북 2장 file 관리자 2014.07.11 1579
522 [업데이트][10 시애틀] RAD Studio 10 시애틀 서브스크립션 업데이트 1 [3] file 험프리 2015.11.25 1572
521 Developer Direct Live in 부산(5/20 세미나 발표자료) [1] file Humphery 2014.05.21 1567
520 [고객 사례- 박물관, RAD Studio+비콘] 사이토바루 고고학 박물관 – 비콘 활용 솔루션 관리자 2016.11.04 1564
519 [개발환경] RAD 스튜디오에서 Git 설정 및 불러오기(2) 험프리 2019.06.20 1562
518 네이티브 IOS & 안드로이드 앱 만들기 첫 걸음 관리자 2021.06.09 1559
517 iOS 64bit 배포 시 ITMS-90092 오류 대응 [1] file Humphery 2015.04.09 1557
516 [발표자료] 20190214 델파이 24주년 기념 세미나: 델파이 앱 현대화 방안 - 다양한 데이터 서비스 연동하기 관리자 2023.04.20 1554
515 [업데이트][10.2 도쿄][릴리즈 1] 10.2 도쿄 - 릴리즈 1이 출시되었습니다. 험프리 2017.08.09 1550