본문 바로가기
프로그래밍

TIniFile 대신 TMemIniFile 사용하면?

by 알 수 없는 사용자 2012. 4. 19.

TMemIniFile 클래스에 대해 살펴 보고자 한다.


1. 객체 위치

     TMemIniFile은 TIniFile처럼 IniFiles 유닛에 구현되어있다.

     C++Builder에서는 #include <IniFiles.hpp>

     Delphi에서는 Uses절에   IniFiles 를 추가하면 된다.


2. TIniFile 과 같은점 

    TIniFile처럼 TCustomIniFile 를 상속받았다.
     그래서 사용방법은 TIniFile클래스와 거의 동일하다


3. TIniFile과 MemIniFile의 다른점
  
   @ TIniFile은?

     ; TIniFile클래스는 Ini파일의 어떤 값을 읽어오거나 쓸때 
       매번 File을 Open하여 읽기/쓰기 하고 File을 Close한다.

      즉 Read를 100번 반복하면 , 100번이나 File을 open/close하게 된다.
      
      * 많은 Data를 Read/Write할때 속도가 매우 느리다.
          매번 Section과 Key를 파일내용 검색해서 찾아야 할것이다.(windows-api)

      * 하지만 Key값 하나라도 Write하자마다 바로 file에 기록된다.

      * 또한 Read를 반복하더라도 중간에 File이 변경된것이 있으면 변경된 값을 읽어오게 된다.


  @ TMemIniFile은?

     ; 반면 MemIniFile은 이름이 말해 주듯이
       매번 File을 Open하여 읽기/쓰기 하지 않고,  
       파일의 내용을 전부 한번에 읽어와 메모리에 가지고 있으며
       어떤 Key값을 Read/Write할때는 메모리에서 읽어오고 , 메모리에다가 쓰기만 한다.

       1) 메모리에서 읽고 쓰기 하니 , read/write 속도가 빠르다.

       2) 반면 write하더라도 UpdateFile() 함수를 호출하기 전까지는 파일에 적용이 되지 않는다.

       3) 당연한 얘기지만 중간에 파일 내용이 변경되더라도
          Read할때 Memory에서만 읽어오므로, 실제 파일의 값을 읽어오진 않는다.
     

      

4. MemIni 읽고 쓰기 예제

  
//---------------------------------------------------------------------------
#include "IniFiles.hpp"
//---------------------------------------------------------------------------
void __fastcall TForm6::Button1Click(TObject *Sender)
{
    TMemIniFile *MemIni=new TMemIniFile("D:\\Test.ini");
    MemIni->ReadString("HEADER","TEST_KEY","");
    MemIni->WriteString("HEADER","TEST_KEY","TEST_MEMINI_Data");
    MemIni->UpdateFile();
    delete MemIni;
}
//---------------------------------------------------------------------------
     


위와같이 간단한 Key 한두개를 읽고 쓰기 할때는 그냥 TIniFile이 좋을것이다.

하지만
파일 내용이 많고
Ini 객체를 만들어서 프로그램 중간중간 읽고/ 쓰기를 할경우엔  MemIni가 효율적일수 있다.


5. MemIni에서 Disk-File의 내용을 다시 읽어오려면?
   Rename함수를 호출해주면 된다.


void __fastcall TForm6::Button2Click(TObject *Sender)
{
     TMemIniFile *MemIni=new TMemIniFile("D:\\Test.ini");
     ShowMessage(MemIni->ReadString("HEADER","TEST_KEY","없나요?"));
     MemIni->Rename(MemIni->FileName,true);//같은 파일로 하면, load를 true로 해서 다시 load한다.
     ShowMessage(MemIni->ReadString("HEADER","TEST_KEY","없나요?"));
     delete MemIni;
}
//---------------------------------------------------------------------------



6. MemIni와 IniFile의 또 다른점 ?

   MemIni 파일을 save하면 파일 중간에 주석이나 공백 라인이 사라진다.

//원래 Ini 파일

  
[HEADER]
FILE_VER=2
TRAIN_COUNT=1
RFIDs=00008273,
AXIS_COUNT=4,
CAR_DIR=1,
ENTER_TIME=20120316134033
LEAVE_TIME=20120316134057

RECOGNIZE_RATE_ALL=100.0%,16/16
RECOGNIZE_RATE_NEL=100.0%,16/16

;NUM=fileName,기준,검사결과,두께1,두께2,두께3,(위치1),(위치2),(위치3)
;결과값 0=OK , 1=NG(위험) , 2=사진확인 , 3=Warning(주의) 


[00008273]
1=20120316134053_00008273_1_1_NEL.bmp, 5.00, 0, 17.79  , 0.00 , 0.00 , 425.18, 688.81 , 431.51 , 806.09 , 0.00, 0.00 , 0.00 , 0.00 , 0.00, 0.00 , 0.00 , 0.00 , 261.00, 624.96 , 717.00 , 598.81 , 0.1515 
2=20120316134053_00008273_1_2_NEL.bmp, 5.00, 0, 18.27  , 0.00 , 0.00 , 713.05, 675.39 , 713.20 , 793.27 , 0.00, 0.00 , 0.00 , 0.00 , 0.00, 0.00 , 0.00 , 0.00 , 412.00, 601.85 , 875.00 , 601.25 , 0.1550 
3=20120316134053_00008273_1_3_NEL.bmp, 5.00, 3, 8.23  , 0.00 , 0.00 , 529.30, 670.42 , 530.95 , 724.80 , 0.00, 0.00 , 0.00 , 0.00 , 0.00, 0.00 , 0.00 , 0.00 , 367.00, 593.64 , 824.00 , 580.18 , 0.1513 

     
  

//MemIni로 Load한후에 UpdateFile하면?
다음과 같이 주석이나 공백라인이 다 사라지게 된다.

  
[HEADER]
FILE_VER=2
TRAIN_COUNT=1
RFIDs=00008273,
AXIS_COUNT=4,
CAR_DIR=1,
ENTER_TIME=20120316134033
LEAVE_TIME=20120316134057
RECOGNIZE_RATE_ALL=100.0%,16/16
RECOGNIZE_RATE_NEL=100.0%,16/16

[00008273]
1=20120316134053_00008273_1_1_NEL.bmp, 5.00, 0, 17.79  , 0.00 , 0.00 , 425.18, 688.81 , 431.51 , 806.09 , 0.00, 0.00 , 0.00 , 0.00 , 0.00, 0.00 , 0.00 , 0.00 , 261.00, 624.96 , 717.00 , 598.81 , 0.1515
2=20120316134053_00008273_1_2_NEL.bmp, 5.00, 0, 18.27  , 0.00 , 0.00 , 713.05, 675.39 , 713.20 , 793.27 , 0.00, 0.00 , 0.00 , 0.00 , 0.00, 0.00 , 0.00 , 0.00 , 412.00, 601.85 , 875.00 , 601.25 , 0.1550
3=20120316134053_00008273_1_3_NEL.bmp, 5.00, 3, 8.23  , 0.00 , 0.00 , 529.30, 670.42 , 530.95 , 724.80 , 0.00, 0.00 , 0.00 , 0.00 , 0.00, 0.00 , 0.00 , 0.00 , 367.00, 593.64 , 824.00 , 580.18 , 0.1513
     



7. MemIni에만 있는 기능?

    그리고 TIniFile에는 없으면서 MemIniFile에만 있는 기능이 있다.
    그것은 파일이 저장이 없이,  INI 방식의 Memory상의 저장소로 사용이 가능하다는 것이다.

  


void __fastcall TForm6::Button3Click(TObject *Sender)
{
    TMemIniFile *MemIni=new TMemIniFile(""); //file-nothing
    MemIni->WriteString("HEADER","TEST_KEY","Memery save");
    ShowMessage(MemIni->ReadString("HEADER","TEST_KEY",""));
    delete MemIni;
}
//---------------------------------------------------------------------------

     

 

          

      

현재 ICT  Project에 TIniFile을 많이 쓰고 있다.

많은 Key를 read/write하고 있기 때문에 속도가 많이 느린 편이다.

장단점을 잘 파악하여, MemIniFile로 변경을 고려해 볼 필요가 있을것 같다.