LazarusCompleteGuide:5.2
구성 파일
연속된 세션들 간에 현재 상태를 저장할 필요가 있는 프로그램이라면 그 구성을 저장할 수 있어야 한다. 프로그램과 관련된 세션 데이터를 저장하는 데에는 구성 파일이 적격이다. 세션 정보는 전역적이거나 (시스템의 모든 사용자에게 적용) 사용자 특정적, 둘 중 하나다. 플랫폼 독립적 프로그램 또한 구성 파일이 애플리케이션의 리소스 파일을 저장할 장소를 인지하도록 요한다.
SysUtils 유닛은 구성 파일을 위한 올바른 보관(storage) 위치를 발견하기 위한 특수 루틴을 포함한다. GetAppConfigDir 와 GetAppConfigFile 을 이용해 보관 디렉터리 또는 구성 파일의 완전한 파일명을 검색할 수 있다.
function GetAppConfigDir(Global: Boolean): String;
function GetAppConfigFile(Global: Boolean): String;
function GetAppConfigFile(Global: Boolean; SubDir: Boolean): String;
두 함수 모두 단일 파라미터 Global을 가진다. 이것이 True인 경우, 전역적 구성 파일명이 리턴되고, False일 경우 현재 사용자 계정에 해당하는 구성 파일명이 리턴된다. 실제 위치가 어딘지는 운영체제에 따라 좌우되며, 개발자나 최종 사용자에게 중요하지 않다.
하지만 디버깅을 목적으로 하거나 파일 내용을 수동으로 검사하는 경우라면 구성 파일의 보관 위치를 아는 것이 유용하다. 따라서 아래 표에 몇 가지 운영체제에서 구성 파일의 실제 위치를 표시하였다. 아래 정보는 FPC 2.2.4 버전의 Windows XP에 적용된다 (영문 버전 먼저). 해당 정보를 얻기 위해 사용한 프로그램은 configtest 라고 부른다.
Windows 6.x 의 새 디렉터리 구조는 (Vista와 Windows 7이 마이크로소프트에서 내부적으로 알려지듯이) 기본적으로 Windows 5.x의 (Windows 2000과 XP) 디렉터리 구조와 다르다. 물론 마이크로소프트사가 추후 윈도우 버전에서 이를 다시 바꾸기로 결정할지도 모를 일이다. 따라서 GetAppConfigdir 와 같은 루틴을 사용해야 하는 이유와 (또는 Windows API에서 그에 해당하는 루틴을 사용) 하드코딩된 경로는 절대 사용해선 안 되는 이유가 더욱 더 중요해진다. Windows 98SE에서 프로그램을 실행하면 알 수 있듯이 (내부에선 Windows 3.98로 알려짐) 마이크로소프트사는 과거에 이 영역을 수차례 변경하였다. Windows 98SE는 Windows NT 계열과 같은 사용자 계정이 없으며, 경로는 아래와 같다:
GetAppConfigDir(True) | C:\WINDOWS\All Users\Application Data\CONFIGTEST\ |
GetAppConfigDir(False) | C:\WINDOWS\Local Settings\Application Data\CONFIGTEST\ |
GetAppConfigFile(True) | C:\WINDOWS\Local Settings\Application Data\CONFIGTEST\ |
GetAppConfigFile(False) | C:\WINDOWS\Local Settings\Application Data\configtest\Configtest.cfg |
Windows XP와 Windows 98의 주요 차이점은 XP에서 로컬 구성 파일이 사용자마다 따로 보관된다는 점이다. Windows 98은 이 개념을 인식하지 못한다. 이번 경우 독일어와 영문 PC에서 동일한 결과가 나왔다. 물론 Linux에서는 완전히 다를 것이다. Debian GNU/Linux 5와 FPC 2.2.4. FreeBSD에 대한 예제는 동일한 결과를 제공한다:
GetAppConfigDir(True) | /etc/configtest/ |
GetAppConfigDir(False) | /home/Username/.config/ |
GetAppConfigFile(True) | /etc/configest.cfg |
GetAppConfigFile(False) | /home/Username/.config/configtest.cfg |
Linux와 FreeBSD에서는 전역 구성 파일이 /etc 내에 애플리케이션에 따라 다른 하위디렉터리에 보관되며, 로컬 구성은 현재 사용자의 홈 디렉터리 내 숨겨진 디렉터리에 보관되는데 이는 주로 /home/$USER/ 이긴 하나 어디든 위치할 수 있다. 점으로 시작하는 디렉터리 이름은 리눅스에서 숨겨진다. 파일을 저장하려면 먼저 파스칼 명령 MkDir 를 이용해 GetAppConfigDir 가 지정한 로컬 디렉터리를 생성해야 한다. 이것을 완료해야만 저장이 가능해진다.
MacOS X에서 홈 디렉터리는 보통 /Users 하에 위치하므로 FPC 2.2.4 버전을 이용 시 아래와 같을 것이다:
GetAppConfigDir(True) | /etc |
GetAppConfigDir(False) | /Users/Username/.config/configtest |
GetAppConfigFile(True) | /etc/configest.cfg |
GetAppConfigFile(False) | /Users/Username/.config/configtest.cfg |
해당 정보를 얻기 위한 테스트 프로젝트는 아래와 같이 간단한 명령 행 프로그램이 될 수도 있고:
program configtest;
{$apptype Console}
uses SysUtils;
begin
WriteLn('GetAppConfigDir(True): ', GetAppConfigDir(True));
WriteLn('GetAppConfigDir(False): ', GetAppConfigDir(False));
WriteLn('GetAppConfigFile(True): ', GetAppConfigFile(True));
WriteLn('GetAppConfigFile(False): ', GetAppConfigFile(False));
end.
아니면 위의 프로그램만큼이나 작성하기 쉬운 작은 GUI 프로그램이 될 수도 있다. 이러한 경우 TMemo 필드를 출력 위젯으로 사용한다. 창의 FormCreate 이벤트에 아래 내용을 삽입한다:
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Add('GetAppConfigDir(True): ' + GetAppConfigDirUTF8(True));
Memo1.Lines.Add('GetAppConfigDir(False): ' + GetAppConfigDirUTF8(False));
Memo1.Lines.Add('GetAppConfigFile(True): ' + SysToUTF8(GetAppConfigFile(True)));
Memo1.Lines.Add('GetAppConfigFile(False): ' + SysToUTF8(GetAppConfigFile(False)));
end;
위의 GUI 프로그램을 사용 시 이점은 결과를 표시하기 위해 콘솔 창을 열 필요가 없이 개발 환경 자체에서 연구할 수 있다는 점이다. 두 프로그램의 결과는 물론 동일하다.