공통 [팁] TIniFile과 TMemIniFile 사용

2019.12.04 09:45

험프리 조회 수:1453

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 15448
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13963
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16499
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22057
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23268
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18924
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39259
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174726
694 XE에서 MySQL 연결오류 및 한글문제 해결 [3] c2design 2013.08.28 10730
693 [환경설정] 아마존 EC2 이용해 리눅스 서버 환경 구축하기 file 험프리 2017.04.20 10642
692 OAuth 2.0 연동 - 카카오 API(카카오톡 프로필) [9] 험프리 2018.12.26 10029
691 이 달의 기술자료 - 2014년 8월 file 험프리 2014.07.04 9945
690 [따라하기] 도서대여 프로그램 만들기(VCL, DB프로그래밍) [2] file 험프리 2017.01.19 9839
689 이 달의 기술자료 - 2014년 3월 험프리 2014.03.05 9570
688 RAD Studio 빌드번호 확인하는 방법법 [1] file 험프리 2016.01.08 9489
687 RadPHP XE2 에서 한글 문제 [2] file 박병일 2012.03.08 9118
686 BOGO 프로모션 툴 다운로드 받는 방법 안내(2015.6.1~2015.6.30 구매고객) 관리자 2014.06.16 8776
685 RadPHP 한글문제 관리자 2012.04.13 8196
684 [REST API][실습] REST API 클라이언트 개발하기(REST Client 이용) [2] 험프리 2017.05.23 7102
683 [마이그레이션] 유니코드 적용시 검토할 사항들 file 험프리 2014.08.21 7013
682 HTML5 Builder로 시작하는 Hello World 모바일 클라이언트 앱 생성하기 (한글 번역) 관리자 2012.09.20 6969
681 XE5 안드로이드 단말기 연결시 확인사항 file c2design 2013.09.23 6879
680 [환경설정] 아마존 EC2 이용해 윈도우 서버 환경 구축하기 [1] file 험프리 2017.04.13 6213
679 [10.2 도쿄] 델파이/C++빌더 리눅스 개발환경 설정하기 [1] file 험프리 2017.02.21 6126
678 David I의 31 XE3 퀵 비디오 - HTML5 빌더로 클라이언트 모바일 앱 개발하기 관리자 2012.10.15 5901
677 RAD스튜디오 개발환경(IDE) 사용법: 파이어몽키 코스북 3장 file 관리자 2014.07.09 5832
676 [따라하기] 건강데이터 수집 및 기록 시스템 #1 - BLE 기반 스마트 체중계에서 실시간 데이터 받기 [1] Humphery 2015.10.02 5796
675 이 달의 기술자료 - 2015년 04월 험프리 2015.03.26 5677