공통 [팁] TIniFile과 TMemIniFile 사용
2019.12.04 09:45
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);
참고자료
- [docwiki] Using TIniFile and TMemIniFile
- [docwiki] IniFilesTMemIniFile 코드 샘플 -델파이, C++