Makale Özeti

Registry aslında sıradan kullanıcıların varlıgından bile haberlerinin olmadıgı, ama bizim için çok kritik bir yapıdır. Bu yapının asıl amacı, sistemimiz, kullanıcılar ve makinamızdaki uygulamaların sürekli verilerinin tutulmasıdır, yani bir çeşit veritabanıdır. Bu yapı Windows ile entegre oldugu için, uygulamalarımız ne zaman çalışırsa çalışsın, registry ile haberleşerek ihtiyaç duydugu verileri alabilir ve kayıt edebilir. Bu yapıya, ister uygulama geliştirirken ister de var olan sistem ile ilgili bilgileri kullanırken çok ihtiyacımız olacak. Bu makalemizin konusu Registry'de işlemler...

Makale

Özet   : Registry aslında sıradan kullanıcıların varlıgından bile haberlerinin olmadıgı, ama bizim için çok kritik bir yapıdır. Bu yapının asıl amacı, sistemimiz, kullanıcılar ve makinamızdaki uygulamaların sürekli verilerinin tutulmasıdır, yani bir çeşit veritabanıdır. Bu yapı Windows ile entegre oldugu için, uygulamalarımız ne zaman çalışırsa çalışsın, registry ile haberleşerek ihtiyaç duydugu verileri alabilir ve kayıt edebilir. Bu yapıya, ister uygulama geliştirirken ister de var olan sistem ile ilgili bilgileri kullanırken çok ihtiyacımız olacak. Bu makalemizin konusu Registry'de işlemler...

Başlık : C# ile Windows Registry işlemleri

Registryde işlem yapmak sanıldıgının aksine çok kolay ama oldukcada risklidir. Ne yaptıgımızdan emin olmalı ve mutlaka sistemin registry yedegini almamızda fayda var. İlk olarak yapıyı bir ögrenelim:

Yapıyı şöyle özetleyebiliriz;

HKEY_CURRENT_USER : O an açılmış oturum(kullanıcı) ile ilgili bilgileri barındırır. Mesela, kullanıcı klasörleri, arkaplan resmi veya renkleri gibi kullanıcıya has bilgiler.

HKEY_USERS : Aslında HKEY_CURRENT_USER nu memünü bir alt menüsüdür. Bütün kullanıcı bilgilerini barındırır.

HKEY_LOCAL_MACHINE : Bilgisayarın konfigürasyon bilgilerini içerir.

HKEY_CLASSES_ROOT : Aslında HKEY_LOCAL_MACHINE\Software'in bir alt menüsüdür. Açık olan ve çalışan programlarla ilgili verileri saklar.

HKEY_CURRENT_CONFIG : Sistemin donanım profilini bulundurur.

    Bu başlık altındaki verilerin saklanma şekli Anahtar - Veri ( Key - Value ) yapısındadır. Bu makalemizde bir registry anahtarı nasıl oluşturulur, degiştirilir ve silinir onu inceleyecegiz. İlk olarak bilmemiz gereken, registry işlemleri için
Microsoft.Win32 namespace kullanacagımızı bilmeniz. Bu namespace altında 2 ana at class daha var bunlar:

Microsoft.Win32.RegistryKey : registry deki alt anahtarları temsilen kullanılan class
Microsoft.Win32.Registry : registrydeki kök anahtarlar için kullanılıyor

Bir alt anahtarı seçmek için ilk önce, onun kök anahtarını seçmek gerekiyor. Yazının ilerleyen aşamalarında konuya daha hakim olacaksınız.

Registry'den Anahtar Okumak

    Ben en kolay yöntemden bahsedecegim, bu yöntem ulaşmak istedigimiz anahtarın tam yolunu biliyor isek, işimizi oldukca kolaylaştırıyor, aşagıdaki örnekde görebiliyoruz, mesela sistemizdeki ağ kartlarının isimlerini ögrenelim, bu veri

\\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\

altında bulunuyor. Örnek benim makinamda tanımlı 2 network kartı bulunmaktadır, bu veriler her makinadaki konfigurasyon farklılıklarından dolayı, farklı farklıdır, bu nedenle aşagıdaki gibi parametrik yapıyoruz;

Bizim bu path i bilmemiz durumunda yapmamız gereken, ilk olarak kaç tane kart bulundugu verisinin okunmasıdır;

int i=Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows Nt").OpenSubKey("CurrentVersion").OpenSubKey("NetworkCards").SubKeyCount;

Bu bize 2 degerini dönderecektir, SubKeyCount ile aldık. Bunu kullanarak sub-keylerdeki( 14 ve 2 ) degerleri okuyacagız, ama önce bu sub-keylerin isimlerini okuyalım isterseniz, GetSubKeyNames() bize sub-keylerin isimlerini dönderecek ('14' ile '2'), bir string array ile dönüyor degerler;

string[] Nnosu=Registry.LocalMachine.OpenSubKey("software").OpenSubKey("Microsoft").OpenSubKey("Windows Nt").OpenSubKey("currentversion").OpenSubKey("NetworkCards").GetSubKeyNames();



Yukarıda gördügünüz gibi, "Description"da value olarak network kartımızın adı yazmaktadır, bunu okumak ve bir combobox'a doldurmak istedigimizi farz edelim;

for(int a=0;a<=i-1;++a)
{
    comboBox1.Items.Add(Registry.LocalMachine.OpenSubKey("software").OpenSubKey("Microsoft").OpenSubKey("Windows Nt").OpenSubKey("currentversion").OpenSubKey("NetworkCards").OpenSubKey(Nnosu[a]).GetValue("description"));
}

Gördügünüz gibi GetValue("description")  ile degeri okuduk. Sonuç aşagıdaki gibi olacaktır;

    Benim makinamda tanımlı olan iki network kartının tam adı, comboboxda görülmektedir. Registryden okuma basitce bu methodlarla yapılabilmektedir.
 

 

Registry'de Anahtar Yaratmak

Registryden okumanın ne kadar kolay oldugunu gördünüz, yeni bir anahtar yaratmaktada son derece kolay. Eger nerede yaratacagımı biliyorsak aşagıdaki gibi kolayca yaratabiliriz;

RegistryKey MyReg = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TSK\\MissionSecret\\NobetV0.4");

CreateSubKey() ile yeni anahtar yaratıyoruz, bu anahtarın altına value'ler oluşturmak ve onlara data vermek içinse;
 

 

 

   for (int i = 1; i < 4 ; i++)
   {
      MyReg.Write(i.ToString(), arrayMyFileNames[i]);
   }

Bir diger önemli method ise ValueCount()'dır. Mesela aşagıdaki örnekte bize 4 döndericektir. Bir SubKey altındaki value sayısını verir.

MyReg.ValueCount();

Registry'de Anahtar Silmek

Anahtar veya deger silerken dikkatli olmamız lazım, silinen anahtarın konumunu eksiksiz bildirmemiz gerekli, anahtar silerken aşagıdaki gibi

MyReg.DeleteSubKey("NobetV0.4");

Ama bir sub key altındaki degeri silmek içinse;

MyReg.DeleteValue("1");

Bir anahtarın altınaki bütün anahtarları silmek içinse;

MyReg.DeleteSubKeyTree("TSK");

Aşagıdaki örnek kodda, geliştirmiş oldugunuz bir uygulamada, en son üzerinde çalışılan dosyaları veya sisteme giriş yapmış son kullanıcıların kullanıcı isimlerini veya sürekli ihtiyaç duyulan dosya pathlerinin saklanması ve tekrar okunmasına anlatılmıştır;

RegistryKey kayit = Registry.CurrentUser.OpenSubKey("SOFTWARE\\TSK\\MissionSecret\\NobetV0.4");
int dosyasayisi = kayit.ValueCount;
for (int i = 1; i < dosyasayisi+1; i++)
{
    eskidosyalar[i]=kayit.GetValue(i.ToString()).ToString();
}

Program kapanırken son degerleri regisrty'e yazmak içinse;

RegistryKey kayit = Registry.CurrentUser.OpenSubKey("SOFTWARE\\TSK\\MissionSecret\\NobetV0.4");
kayit.DeleteSubKeyTree();
for (int i = 1; i < 10; i++)
{
     if (eskidosyalar[i] == null)
         break;
     kayit.Write(i.ToString(), eskidosyalar[i]);
}

Yeniden farklı bir makalede görüşmek üzere, çalışmalarınızda başarılar...