끝나지 않는 프로그래밍 일기


1. 레지스트리(Registry)


이번 강좌에서 다루게 될 내용은, C#에서 제공하는 레지스트리 클래스를 이용한 레지스트리 읽기, 레지스트리 쓰기, 레지스트리 관리에 대해 간단히 알아보려고 합니다. 우선 레지스트리 클래스를 이용하려면 Microsoft.Win32 네임 스페이스를 사용하여야 합니다.

using Microsoft.Win32;

그리고 아래 멤버들은, 오늘 우리가 배우게될 RegistryKey 클래스의 멤버들입니다.


멤버 메서드

설명 

CreateSubKey

새 하위 키를 만들거나 기존 하위 키를 엽니다.

OpenSubKey

지정된 하위 키를 검색합니다.

DeleteSubKey

지정된 하위 키를 삭제합니다.

DeleteSubKeyTree

하위 키와 자식 하위 키를 재귀적으로 삭제합니다.

GetSubKeyNames

모든 하위 키 이름이 포함된 문자열의 배열을 검색합니다.

SetValue

레지스트리 키에서 이름/값 쌍의 값을 설정합니다.

GetValue

지정된 이름과 연결된 값을 검색합니다.

GetValueKind

지정된 이름과 연결된 값의 레지스트리 데이터 형식을 검색합니다.

GetValueNames

이 키와 관련된 모든 값 이름이 포함된 문자열의 배열을 검색합니다.

DeleteValue

지정된 값을 이 키에서 삭제합니다.


그럼, 먼저 새로운 하위 키를 만드는 예제부터 시작하여 위에 있는 멤버 메서드들을 몇몇개만 익혀보도록 합시다. 지금부터 작성되는 예제는 윈도우 폼 프로젝트를 기준으로 합니다.


2. 하위 키 만들기(Create Sub Key)


하위 키를 만드는 CreateSubKey부터 살펴보도록 합시다. 아래는 CreateSubKey 메서드의 선언입니다.

public RegistryKey CreateSubKey(string subkey)

첫번째 인자에는 새로 만들 하위 키의 이름, 혹은 경로가 들어갑니다. 만약에 HKEY_CURRENT_USER에 "c# rkey"라는 하위 키를 만들고 그 키에다 또다시 "testsubkey"라는 하위 키를 만드려면 어떻게 해야 할까요? 아래와 같이 작성하시고 컴파일 후 실행만 하셔도 지정한 경로에 하위 키가 생성됩니다.

// 예 1
RegistryKey rkey = Registry.CurrentUser.CreateSubKey("c# rkey").CreateSubKey("testsubkey");
// 예 2
RegistryKey rkey = Registry.CurrentUser.CreateSubKey(@"c# rkey\testsubkey");

직접 레지스트리 편집기를 열어 하위 키가 제대로 생성되었는지 확인해보도록 하겠습니다.



잘 보이시죠? 만약에 하위 키를 만들지 못했다면 CreateSubKey 메서드는 null을 반환했을 것입니다. 반대로 성공했다면, 새로 만든 하위 키를 나타내는 RegistryKey 개체가 반환되어 rkey에 들어갑니다.


3. 하위 키 열기(Open Sub Key)


하위 키를 여는 OpenSubKey에 대해 알아봅시다. 아래는 OpenSubKey 메서드의 선언입니다.

public RegistryKey OpenSubKey(string name)

첫번째 인자로는 열려고 하는 하위 키의 이름, 혹은 경로가 들어갑니다. 반환값으로는 요청된 하위 키가 반환되며, 하위 키를 열지 못했을경우 null을 반환합니다. 방금 CreateSubKey를 통해 만든 하위 키에 접근을 해보도록 합시다.

아래는 OpenSubKey를 통해 HKEY_CURRENT_USER\c# rkey\testsubkey에 접근하는 예입니다.

// 예 1
RegistryKey rkey = Registry.CurrentUser.OpenSubKey("c# rkey").OpenSubKey("testsubkey");
// 예 2
RegistryKey rkey = Registry.CurrentUser.OpenSubKey(@"c# rkey\testsubkey");

만약, OpenSubKey 메서드로 지정된 하위 키를 여는데, 이 키에 대한 쓰기 권한(Write Access)가 필요하면, 두번째 인자에 true라고 설정하시면 됩니다.

RegistryKey rkey = Registry.CurrentUser.OpenSubKey(@"c# rkey\testsubkey", true);


4. 하위 키 삭제하기(Delete Sub Key)


하위 키를 삭제하는 DeleteSubKey에 대해 알아봅시다. 아래는 DeleteSubKey 메서드의 선언입니다.

public void DeleteSubKey(string subkey)

첫번째 인자로는 삭제할 하위 키의 이름, 혹은 경로가 들어갑니다. 반환값은, void형이므로 반환되지 않습니다. 이제, DeleteSubKey 메서드를 이용하여 미리 만들어 두었던 하위키(HKEY_CURRENT_USER\c# rkey\qwd)를 삭제해보도록 하겠습니다.


<하위 키 존재: HKEY_CURRENT_USER\c# rkey\qwd>

// 하위 키 삭제: HKEY_CURRENT_USER\c# rkey\qwd
Registry.CurrentUser.DeleteSubKey(@"c# rkey\qwd");


5. 값 쓰기(Set Value)


이번에는 방금 만든 하위 키에 레지스트리 값을 써볼까요? 아래는 SetValue 메서드의 선언입니다.

public void SetValue(string name, Object value)

첫번째 인자로는 저장할 값의 이름이 옵니다. 두번째 인자로는 저장할 데이터를 말합니다. 위의 예제에서 SetValue 함수를 덧붙여 레지스트리 값을 쓰는 간단한 예제를 만들어보도록 합시다.

RegistryKey rkey = Registry.CurrentUser.CreateSubKey("c# rkey").CreateSubKey("testsubkey");
rkey.SetValue("test", "테스트!");
rkey.SetValue("text", "텍스트!");

SetValue은 위의 선언과 같이 void형으로, 반환값이 없습니다. 그리고 두번째 인자에 정수를 넣든, 문자열을 넣든 아래와 같이 문자열 형(REG_SZ)로 저장됩니다. 



만약에 다른 종류로 저장하고 싶으시면, RegistryValueKind를 지정해야만 합니다. 

오버로드 덕분에 RegistryValueKind를 지정하건, 안하건 값을 쓸수는 있습니다. 그렇지만 RegistryValueKind를 따로 지정하지 않으면 위에서 말한대로 문자열 형(REG_SZ)로 저장됩니다.

public void SetValue(string name, Object value, RegistryValueKind valueKind)

RegistryValueKind는 데이터를 저장 할 때 사용할 레지스트리 데이터 형식을 말합니다. RegistryValueKind 멤버에는 아래와 같이 7가지가 있습니다. 참고하세요.


멤버 이름

설명 

String 

문자열(REG_SZ)

ExpandString 

문자열(환경변수 포함, REG_EXPAND_SZ)

Binary

이진 데이터(REG_BINARY)

DWord 

32비트 이진수(REG_DWORD) 

MultiString 

문자열 배열(REG_MULTI_SZ) 

QWord 

64비트 이진수(REG_QWORD) 

Unknown 

지원되지 않는 레지스트리 데이터 형식(REG_RESOURCE_LIST) 


예>

rkey.SetValue("NUM", 1234, RegistryValueKind.DWord);

결과>


6. 값 가져오기(Get Value)


이번에는 방금 쓴 값을 가져와서 읽어보도록 하겠습니다. 아래는 GetValue 메서드의 선언입니다.

public Object GetValue(string name)

선언을 살펴보면, 첫번째 인자값으로는 가져올 값의 이름이 옵니다. 반환값으로는, 그 이름의 데이터가 오고 없으면 null을 반환합니다. 참고로 이름(name)은 대/소문자를 구분하지 않습니다. 아래는 GetValue 메서드를 이용하여, 값을 가져오는 예입니다.

RegistryKey rkey = Registry.CurrentUser.OpenSubKey(@"c# rkey\testsubkey");
MessageBox.Show(rkey.GetValue("test").ToString());

위와 같이 작성하고 컴파일 후 실행하면, test와 연결된 값이 메세지박스를 통해 아래와 같이 출력됩니다.



7. 값 제거하기(Delete Value)


이번에는 마지막으로, 값을 제거하는 DeleteValue에 대해서 알아보도록 하겠습니다. 아래는 DeleteValue 메서드의 선언입니다.

public void DeleteValue(string name)

선언을 살펴보면, 첫번째 인자값으로는 삭제할 값의 이름이 옵니다. 반환값은 역시 void형이므로, 반환되는 값은 없습니다. 한번 DeleteValue 메서드를 이용하여, HKEY_CURRENT_USER\c# rkey\testsubkey 경로에 있는 test를 제거해보도록 하겠습니다.


// 하위 키 HKEY_CURRENT_USER\c# rkey\testsubkey에 있는 test 제거
RegistryKey rkey = Registry.CurrentUser.OpenSubKey(@"c# rkey\testsubkey", true);
rkey.DeleteValue("test");