개발자 블로그

C#에서 ini 파일 읽고, 쓰기 본문

프로그래밍/Windows

C#에서 ini 파일 읽고, 쓰기

로이드.Roid 2016. 2. 16. 15:09

C# 윈폼 프로그래밍에서 사용자가 지정한 마지막 창 크기 및 위치 같은 정보를 저장하기 위해서 간단하게 ini 파일을 사용하기로 결정했다. winapi에는 이러한 기능을 하는 간단한 api가 있지만 C#에서 기본으로 제공하는 클래스에는 해당 기능을 하는 api가 없다. 하지만 해당 winapi를 import해서 사용할 수 있다. 




※ 만약 신규로 프로젝트를 만드는 것이라면, Settings를 활용하자. 매우 편리하게 각종 설정항목을 저장할 수 있다. 사용방법도 정말 간편하다. 아래 유튜브 동영상 한 번 보면 바로 따라서 사용할 수 있다. ini 대신 아래 방법을 사용할 것을 적극 권장한다.


아래 링크에서 해당 api를 import해서 사용하는 클래스 예제를 확인할 수 있다. 

http://kindtis.tistory.com/180

ini 파일 및 관련 API에 대해서 자세한 내용을 확인하고 싶다면, 여기를 클릭하자.


일단 핵심은 .ini파일에 읽고, 쓰는 api 두 개(GetPrivateProfileString, WritePrivateProfileString) 인데, MSDN에서 찾아보니깐 해당 api를 쓰지말라고 하네?? (자세한 내용은 여기를 클릭)

Note  This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.

엉성한 실력으로 해석하자면, "이 함수는 16비트 윈도우와의 호환성 때문에 제공하는거임. 응용프로그램은 초기화 정보 저장을 레지스트리에 해야 됨." 뭐 대략 이정도 되겠다.


왜 ini파일을 쓰지 말라고 하는거냐? (정확히는 ini파일을 쓰지말라기 보다는 위 api를 쓰지 말라는거다.) 아래 링크를 클릭하면 그 이유를 확인 할 수 있다.

https://blogs.msdn.microsoft.com/oldnewthing/20071126-00/?p=24383

대충 번역해보면,

  • 유니코드 지원안함
  • 보안 문제
  • 동기화 문제(멀티쓰레드)
  • 공유 문제(다른 프로그램이 '공유안함'으로 해당 ini 파일을 open한 경우)
  • 바이너리 데이터 저장불가
  • 속도가 느림
  • 파일 크기 제한(최대 32KB)
  • 기타 등등.. (자세한 내용은 위 링크 참고)


그래 뭐 레지스트리에다가 하는게 편하긴하겠지만 대부분 사용자들은 레지스트리에 쓰는거 싫어하잖아? 더군다가 내가 만들려는 프로그램은 인스톨이 필요없는 포터블 버전의 프로그램이라서 레지스트리에 기록해버리면 나중에 사용자가 프로그램을 더 이상 쓰지 않더라도 레지스트리를 자동으로 삭제해 줄 수가 없다. 


그래서 결론은?

나도 모르겠다..-_-;; 참고로 카카오톡PC버전은 ini 파일 관리를 위해서 "minini"라는 라이브러리를 사용한 것 같고. 카카오에서도 쓰는 만큼 웬만큼 검증 된 라이브러리가 아닐까 싶다. (근데 이건 C++)

C#에서 기본으로 제공되는 XmlTextReader/XmlTextWriter를 쓰는 방법도 있을 것 같다. (하지만 저 두 클래스가 위 ini 파일의 문제점을 모두 해결했는지는 모르겠다. 이 점은 minini도 마찬가지. 대신 소스를 제공하니깐 소스 까보면 알 수는 있을 것 같다. 소스코드는 github에서 다운받을 수 있다. 여기를 클릭.)

이래저래 봐도 GetPrivateProfileString, WritePrivateProfileString 만큼 간편한건 음네..

Comments