공통 [팁] TIniFile과 TMemIniFile 사용

2019.12.04 09:45

험프리 조회 수:1427

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 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
633 [10.4 시드니][패치] RAD스튜디오 10.4 '두 번째 패치(Patch 2)'를 다운로드 받으세요! 관리자 2020.07.20 913
632 OAuth 2.0 연동 - 네이버 API 연동(네이버 아이디로 로그인) 험프리 2020.07.15 1169
631 RAD Studio의 생산성 툴링 : 탐색기 김원경 2020.07.09 352
630 RAD Studio의 생산성 툴링 : 북마크 김원경 2020.07.09 355
629 [2020년 상반기] 기술자료 TOP 10 - 개발자들이 가장 많이 클릭한 기술자료는? 관리자 2020.07.07 657
628 이 달의 기술자료 - 2020년 07월 험프리 2020.06.25 462
627 [발표자료] 20200623 코로나19, 데이터와 RAD로 방역하다! file 관리자 2020.06.24 698
626 [10.4 시드니 신기능 Deep Dive] 겟잇 패키지 매니저의 새로운 기능들 관리자 2020.06.22 559
625 북마크, 탐색기 - 무료 IDE 애드온 기능들 업데이트! (10.4용) 관리자 2020.06.16 404
624 [REST-무료제공툴] REST 디버거 - REST 서비스를 언제든 신속하게 분석할 수 있습니다. file 험프리 2020.06.15 1004
623 [발표자료] 20200609 What's NEW! RAD스튜디오 10.4 시드니 file 관리자 2020.06.10 478
622 [10.4 시드니 신기능 Deep Dive] 델파이 추가된 문법 및 변경 사항 김원경 2020.06.05 489
621 [10.4 시드니 신기능] iOS와 맥OS 지원 강화 관리자 2020.06.04 673
620 [10.4 시드니 신기능] 고해상도 DPI용 VCL 콘트롤(들) 관리자 2020.06.04 495
619 [10.4 시드니 신기능] 개발환경 강화 관리자 2020.06.04 442
618 [RAD Studio 10.4 패치1 ] C ++ 디버깅과 누락 파일 패치 – 패치를 설치하는 새로운 방법! file 김원경 2020.06.01 635
617 이 달의 기술자료 - 2020년 06월 file 험프리 2020.05.29 358
616 [10.4 시드니 신기능] 델파이 10.4 런타임 라이브러리 향상 file 김원경 2020.05.28 610
615 [10.4 시드니 신기능] Sarina Dupont이 정리한 주요 신기능 모아 보기 험프리 2020.05.28 4295