Media Log


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");


  1. 황순표 at 2012.12.06 15:14 신고 [edit/del]

    벌써..이만큼..따라왔는데..헷갈리기 시작합니다..그래도 감사하게 잘 읽고 있습니다

    Reply
  2. stylekorea at 2013.02.22 15:58 신고 [edit/del]

    후우 저도 다 따라왔네요 강좌 감사드립니다
    고급편도 계속 포스팅 됬으면 좋겠네요 ㅋㅋ
    일단 복습부터...

    Reply
  3. at 2013.03.07 08:49 [edit/del]

    비밀댓글입니다

    Reply
  4. 푸르름 at 2013.03.12 18:15 신고 [edit/del]

    예제를 따라 하다가 MessageBox.Show(rkey.GetValue...) 에서 컴파일 오류가 나서 아래와 같이 해 보았는데 여전히 안됩니다.

    using System.Windows.Forms;

    class Program : Forms
    {

    MessageBox.Show("콘솔 프로젝트에서 메세지박스 사용은 어떻게 해야... ?");

    }

    Reply
    • BlogIcon EXYNOA at 2013.03.12 18:48 신고 [edit/del]

      프로젝트 -> 참조 추가 -> 프레임워크 -> System.Windows.Forms을 체크하고 확인을 누릅니다. 그리고 나서 System.Windows.Forms 네임스페이스를 using 해주시면 됩니다.

    • 푸르름 at 2013.03.13 09:28 신고 [edit/del]

      잘 동작합니다.
      감사합니다.^^

      p.s. 건의사항입니다.
      간략하면서도 핵심을 쉽게 전달하는 본 강좌가 마음에 쏙 듭니다!
      후속으로 각종 컨트롤을 사용한 강좌, C#과 VC++을 혼합으로 사용하는 방법, 시리얼통신 터미널 프로그램 만들기 등을 후속으로 계속 진행 주시기를 부탁드립니다.^^

    • BlogIcon EXYNOA at 2013.03.13 18:38 신고 [edit/del]

      감사합니다. 즉시 반영하여 다른 일이 정리되고 나서 바로 각 컨트롤 또는 시리얼 통신 등에 대해 강좌를 이어나가도록 하겠습니다.

    • 푸르름 at 2013.03.13 20:48 신고 [edit/del]

      와우~! 기대가 됩니다.^^!

  5. yangga at 2013.03.15 18:10 신고 [edit/del]

    좋은 강좌 잘 보고 갑니다.
    간단 명료하게 잘 정리되어 참 좋네요!

    Reply
  6. 푸르름 at 2013.03.19 09:31 신고 [edit/del]

    안녕하세요?
    게재해 주신 C#강좌를 모두 다 본 C# 입문자입니다.

    C# 프로그램 소스파일의 확장자는 *.cs 이고, C/C++와는 다르게 *.h 파일이 없다 라고 하는데요...
    만약 다른 프로젝트에서 사용하던 TestA.cs 라는 파일을 현재 프로젝트에서 재작성없이 사용하고 싶다면 어떤식으로 사용하는지요? 혹시 #include "TestA.cs" 라는 것을 대신하는 것이 C# 에 있나요?
    그리고, 기능별로 클래스 파일을 분리하여 작성하는 방법도 알고 싶습니다. 한 개의 클래스가 길어져서 그것을 분리하는 것 말고요.
    추가 강좌에서 다루어 주시면 감사하겠습니다.

    Reply
    • BlogIcon EXYNOA at 2013.03.19 16:23 신고 [edit/del]

      .cs 확장자를 지닌 파일은 클래스 파일이므로 그 클래스의 객체를 만들어 주어 그 객체의 메서드를 그대로 사용하시면 됩니다. 아니면 정적(static) 메서드의 경우 인스턴스를 따로 만들지 않고 메서드를 호출할 수 있습니다.

      기능별로 클래스 파일을 분리하여 작성하는건 나중에 설명해드리도록 하겠습니다. (추가 강좌에 넣을 예정)

  7. 똘스터 at 2013.04.10 15:05 신고 [edit/del]

    안녕하세요! C#강좌 잘읽었습니다!

    너무 깔끔하게 설명을 잘해놓으셔서 이해가 잘됐어요!

    마지막 포스팅하신지 좀 됐는데

    후속으로 C#과 데이터베이스부분도 강의해주시면 좋겟네요~~~

    C#으로 데이터베이스 연동하는 로그인프로그램이라던지 그런 프로젝트도 괜찮을거같습니다!

    강좌 올려주셔서 다시한번 감사드립니다!

    Reply
  8. 승궈니 at 2013.04.12 17:46 신고 [edit/del]

    정말 잘봤습니다.
    감사합니다.

    Reply
  9. at 2013.06.05 02:10 [edit/del]

    비밀댓글입니다

    Reply
  10. 참치캔 at 2013.07.05 14:28 신고 [edit/del]

    정말 멋진 강좌 ^^
    너무 멋지신 분이십니다. 너무 감사하구요.

    Reply
  11. at 2014.11.10 17:13 [edit/del]

    비밀댓글입니다

    Reply
  12. 상도리 at 2017.04.20 15:05 신고 [edit/del]

    강좌 너무 이해 잘되게 잘하시는거 같아요 :) 감사합니다

    Reply

submit

티스토리 툴바