loading

프로그래밍/C#

C# 레지스트리 읽기, 쓰기, 삭제 방법

침착곰 2021. 5. 12. 11:33
반응형

안녕하세요

프로그램을 만들 때 환경설정 정보, 프로그램 설치 시 디폴트로 들어가는 정보를 주로 저장할 때 사용합니다

C#의 레지스트리 읽기, 쓰기, 삭제 + 추가로 다른 기능들도 알아보겠습니다

 

목차

레지스트리(Registry)란?
레지스트리 하위 키 만들기(CreateSubKey)
레지스트리 하위 키 열기(OpenSubKey)
레지스트리 하위 키 삭제(DeleteSubKey)
레지스트리 값 쓰기(SetValue)
레지스트리 값 가져오기(GetValue)
레지스트리 값 삭제하기(DeleteValue)
레지스트리 프로젝트 디자인
전체 소스
프로젝트 첨부 파일

 


레지스트리(Registry)란?

보통 레지스트리란 윈도우 레지스트리를 의미합니다

위키백과에서 정의한 레지스트리입니다

윈도우 레지스트리(Windows Registry)는 마이크로소프트 윈도우 32/64비트 버전과 윈도우 모바일 운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스로, 모든 하드웨어, 운영 체제 소프트웨어, 대부분의 비운영 체제 소프트웨어, 사용자 PC 선호도 등에 대한 정보와 설정이 들어 있다. 사용자가 제어판 설정, 파일 연결, 시스템 정책, 또는 설치된 소프트웨어를 변경하면, 이에 따른 변경 사항들이 레지스트리에 반영되어 저장된다. 레지스트리는 또한 성능 카운터와 현재 사용하고 있는 하드웨어와 같은 런타임 정보를 노출하면서 윈도우를 커널의 운영 체제 안에 제공한다.

이전에 윈도우 프로그램에 대한 구성 설정을 담는 데에는 각 프로그램마다 INI 파일이 사용되었다. 이러한 파일들이 시스템 여러 곳에 퍼짐으로써 찾기가 쉽지 않았었는데, 이러한 연유로 윈도우 레지스트리가 도입된 것이다?

출처 : ko.wikipedia.org/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%EB%A0%88%EC%A7%80%EC%8A%A4%ED%8A%B8%EB%A6%AC

 

이 글을 쓰면서 한 가지 새로운 사실을 알았네요 ㅎㄷ

ini파일이랑 비교하면 레지스트리가 더 정보저장에 용의하네요

두 개과 연관되있을 거라는 것은 생각도 못 했습니다

간단하게 GUI에서의 시스템에 대한 정보를 저장하는 곳이라도 생각하시면 됩니다!

 


레지스트리 하위 키 만들기(CreateSubKey)

레지스트리의 폴더를 만드는 기능이라고 보면 됩니다

RegstryKey를 사용하면 레지스트리 변수를 선언할 수 있습니다

레지스트리 변수 reg를 선언하고 먼저 레지스트리의 HKEY값을 선택해야합니다

참고사항 : HKEY_폴더란 윈도우의 기본이 되는 정보들을 구분해 넣은 폴더라 생각하면 됩니다

 

HKEY는 CurrentUser를 선언

CreateSubKey("Software").CreateSubKey("ABC")를 하면 폴더가 생성됩니다

RegistryKey reg;
reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

 

결과 화면

 


레지스트리 하위 키 열기(OpenSubKey)

레지스트리의 폴더에 접근하는 방법입니다

CreateSubKey로 하위 폴더로 접근하고 최종 접근하려는 폴더에서 OpenSubKey를 사용하면 됩니다

아래처럼 경로를 보여줍니다

RegistryKey reg;
reg = Registry.CurrentUser.CreateSubKey("Software").OpenSubKey("ando");
this.edtOpen.Text = reg.ToString();

 

결과 화면

 


레지스트리 하위 키 삭제(DeleteSubKey)

레지스트리의 폴더를 삭제하는 방법에 대해서 알아보겠습니다

위와 마찬가지로 CreateSubKey로 폴더에 접근한 후 DeleteSubKey를 사용하여 원하는 폴더를 삭제합니다

이렇게하면 위에서 생성한 ABC폴더가 삭제됩니다

Registry.CurrentUser.CreateSubKey("Software").DeleteSubKey("ABC");

 


 

레지스트리 값 쓰기(SetValue)

위에서 레지스트리 폴더를 생성하는 방법에 대해서 알아봤습니다

레지스트리의 값을 추가하는 방법에 대해서 알아보겠습니다

SetValue를 사용하여 레지스트리의 값을 추가할 수 있습니다

SetValue시 레지스트리가 없다면 생성, 있다면 값을 수정합니다

 

먼저 Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC")를 사용하여 경로를 지정합니다

아래와 같이 쓰면 HKEY_CURRENT_USER\Software\ABC\Test 레지스트리가 생성된 것을 확인할 수 있습니다

RegistryKey reg;
reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

reg.SetValue("Test", this.edtWrite.Text);

 

결과 화면

 

추가사항

추가로 SetValue는 Object형태로 값을 입력합니다

SetValue의 3번째 인자에 데이터타입을 넣어주면 데이터를 변경하여 입력하게 됩니다

주로 레지스트리는 바이너리로 저장되어 그런지 바이너리 형태가 많은 것을 볼 수 있습니다

멤버 이름 설명
String 문자열(REG_SZ)
ExpandString 확장 문자열(REG_EXPAND_SZ)
Binary 이진 데이터(REG_BINARY)
DWord 32비트 이진수(REG_DWORD)
MultiString 문자열 배열(REG_MULIT_SZ)
QWord 64비트 이진수(REG_QWORD)
Unknown 윈도우에서 기본적으로 지원하지 않는 레지스트리 데이터 형식(REG_RESOURCE_LIST)

해당 정보는 아래 블로그를 참고하여 작성했습니다!

출처 : blog.hexabrain.net/176

 

사용 방법

3번째 인자에 RegistryValueKind.데이터타입을 넣어서 사용하면 됩니다

reg.SetValue("Test", this.edtWrite.Text, RegistryValueKind.String);

 


레지스트리 값 가져오기(GetValue)

레지스트리 안의 값을 보여줍니다

GetValue는 레지스트리가 아니더라도 값을 가져오는 메서드로 많이 사용되는 기능이죠 ㅎ

 

먼저 Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC")를 사용하여 경로를 지정합니다

아래와 같이 사용하면 "Test"레지스트리 안의 값을 보여줍니다

두 번째 인자에 값을 넣으면 "Test"레지스트리가 null인 경우 그 데이터를 보여줍니다

아래와 같이 적으면 "Test"레지스트리에 데이터가 없다면 "값이 없습니다"를 출력해줍니다

RegistryKey reg;
reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

this.edtRead.Text = reg.GetValue("Test", "값이 없습니다").ToString();

 


레지스트리 값 삭제하기(DeleteValue)

레지스트리 값을 삭제하는 방법입니다

바로 사용방법에 대해서 설명하겠습니다

 

먼저 Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC")를 사용하여 경로를 지정합니다

아래와 같이 reg.DeleteValue(레지스트리)를 하여 삭제하면 됩니다

중간에 if문을 한 이유는 만약 null인 경우 에러가 발생하여 레지스트리가 존재하는 체크해줍니다

RegistryKey reg;
reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

if (reg.GetValue(this.edtDelete.Text, "").ToString() != "")
{
    reg.DeleteValue(this.edtDelete.Text);
}

 

여기까지 레지스트리 읽기 / 쓰기 / 삭제에 대한 기능을 알아봤습니다

윈폼으로 간단하게 모든 기능을 구현했는데 그 부분에 대해서 간단하게 추가로 설명하겠습니다

 


 

레지스트리 프로젝트 디자인

버튼과 TestBox로 위의 기능들을 실행하는 화면을 구현했습니다

 


전체 소스

프로젝트의 전체 코드입니다

위의 레지스트리를 공부하는 참고 바랍니다!

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Regedit
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // 레지스트리 입력 이벤트
        private void btnWrite_Click(object sender, EventArgs e)
        {
            RegistryKey reg;
            reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

            reg.SetValue("Test", this.edtWrite.Text, RegistryValueKind.String);
        }

        // 레지스트리 읽기 이벤트
        private void btnRead_Click(object sender, EventArgs e)
        {
            RegistryKey reg;
            reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

            this.edtRead.Text = reg.GetValue("Test", "값이 없습니다").ToString();
        }

        // 레지스트리 삭제 이벤트
        private void btnDelete_Click(object sender, EventArgs e)
        {
            RegistryKey reg;
            reg = Registry.CurrentUser.CreateSubKey("Software").CreateSubKey("ABC");

            if (reg.GetValue(this.edtDelete.Text, "").ToString() != "")
            {
                reg.DeleteValue(this.edtDelete.Text);
            }
        }

        // 레지스트리 하위 키 열기
        private void btnOpen_Click(object sender, EventArgs e)
        {
            RegistryKey reg;
            reg = Registry.CurrentUser.CreateSubKey("Software").OpenSubKey("ando");
            this.edtOpen.Text = reg.ToString();
        }

        // 레지스트리 하위 키 삭제
        private void btnFDelete_Click(object sender, EventArgs e)
        {
            Registry.CurrentUser.CreateSubKey("Software").DeleteSubKey("ABC");
        }
    }
}

프로젝트 첨부 파일

마지막으로 프로젝트 첨부파일입니다

Regedit.zip
0.21MB

 

여기까지 레지스트리 읽기 / 쓰지 / 삭제에 대한 기능들을 모두 알아봤습니다

글을 쓰다보니 생각보다 내용이 많이 길어졌습니다 ㅠ

레지스트리에 관해서 모르는 부분 또는 틀린 부분이 있다면 댓글 부탁드립니다!!

반응형
그리드형