Kayıt
20 Haziran 2007
Mesajlar
7.709
Beğeniler
0


>>> C# İle Kendi Dosya Uzantınızı Oluşturun <<<

Hepinizin bildiği gibi her uygulamanın kendisine özel dosya türleri vardır, notepad text dosyaları ile çalışır, flash .fla uzantılı dosyalarla çalışır vb, kendi yazdığınız programında kendine özel bir dosya türü olmasını, bu tip dosyaların windows tarafından her zaman sizin uygulamanız ile açılmasını istiyorsanız windows' un kayıt defteri Registry ile haşır neşir olmanız gerekiyor.

C sharp registry işlemleri yapabilmemiz için bize Microsoft.Win32 namespace ini sunmaktadır.


Registry ve RegistryKey sınıfları

Microsoft.Win32 namespace' i içerisinde bulunan Registry ve RegistryKey classları bize kayıt defteri üzerinde istediğimiz işlemleri yapmayı sağlamaktadır.

Registry sınıfı, registry içerisindeki anahtarlara erişebilmemiz için bize aşağıdaki özellikleri sunar;

* Registry.ClassesRoot; (HKEY_CLASSES_ROOT)
* Registry.CurrentConfig; (HKEY_CURRENT_CONFIG)
* Registry.CurrentUser; (HKEY_CURRENT_USER)
* Registry.DynData; (HKEY_DYN_DATA)
* Registry.LocalMachine; (HKEY_LOCAL_MACHINE)
* Registry.PerformanceData; (HKEY_PERFORMANCE_DATA)
* Registry.Users; (HKEY_USERS)

Bu özellikler, RegistryClass cinsinden birer nesne döndürürler, bu nesne ise her metodun ilişkili olduğu registry anahtarına referans içerir.

RegistryKey sınıfının en çok kullanılan metodları ve yaptıkları işler ise şöyledir;

* RegistryKey.CreateSubKey(string subkey) parametre olarak girilen anahtarı (eğer varsa) nesne olarak döndürür, yoksa oluşturur.
* RegistryKey.DeleteSubKey(string subkey) parametre olarak girilen registry anahtarını siler.
* RegistryKey.GetSubKeyNames() açık olan anahtarın bütün alt anahtarlarını bir string dizisi içerisinde geri döndürür.
* RegistryKey.OpenSubKey(string name) parametre olarak girilen anahtarı (eğer varsa) nesne olarak döndürür. Yoksa hata verecektir. try .. catch ile kullanılması salık verilir.
* RegistryKey.GetValue(string name) açık olan anahtarın içerisinde "name" parametresinde belirtilen dize değerini object türünden bir nesne olarak geri döndürür.
* RegistryKey.GetValueNames() açık olan anahtarın barındırdığı tüm dize değerlerini string dizisi içerisinde geri döndürür.
* RegistryKey.SetValue(string name, object value) açık olan anahtar içerisine string parametresinde belirtilen isimde ve value parametresinde girilen değeri taşıyan yeni bir dize değeri oluşturur.

Şimdilik işimize yarayacak olanlar bunlar, tabi RegistryKey sınıfı içerisindeki diğer metod ve özellikleri de yeri geldikçe açıklayacağım.


Örnek Uygulama !..

Sınıf yapılarını da tanıdığımıza göre, artık uygulamaya geçebiliriz.

Visual Studio içerisinde yeni bir Console Application projesi başlatıyoruz isim olarak RegistryApp verebilirsiniz.

Uygulamanın kodları:


Kod:
//bizim programimizin iliskilendirilecegi dosya uzantisi
const string className = ".abc";
const string regIdentifier = "myOwnExt";
static string applicationPath = Environment.CommandLine;
static string iconPath = "";

[STAThread]
static void Main(string[] args)
{
//istedigimiz iconu alabilmek icin komut satiri degiskeninden //tirnaklari kaldirmali ve virgulden sonra icon indexini vermeliyiz ;)
iconPath = applicationPath.Substring(0,applicationPath.LastIndexOf("\"")) + ", 0\"";
iconPath = iconPath.Replace("\"","");
CreateRegistryValue(); //registry duzenlemelerini yapalim..

if(args.Length > 0)
{
printArgs(args);
}

Console.ReadLine();

}

static void printArgs(string[] argList)
{
foreach(string arg in argList)
{
Console.WriteLine("{0}",arg);
}
}

static void CreateRegistryValue()
{
//HKEY_CLASSES_ROOT' u aciyoruz
RegistryKey regKey = Registry.ClassesRoot;
RegistryKey subKey;

//eger daha onceden yapilandirilmamis ise yapilandiriyoruz
if(!isExists(regKey,className))
{
subKey = regKey.CreateSubKey(className);
subKey.SetValue("",regIdentifier); //varsayilan dize degerini belirliyoruz
subKey.Close(); //actigimiz keyi kapatalim

//eger uzantimizin tanimlayici anahtari da yaratilmadi ise bu asamada yaratabiliriz
if(!isExists(regKey,regIdentifier))
{
subKey = regKey.CreateSubKey(regIdentifier);
//dosyamizin bilgilerinde gorunecek turunu yaziyoruz
subKey.SetValue("","Kendi dosya türümüz");

//varsayilan iconu seciyoruz
RegistryKey defaultIco = subKey.CreateSubKey("DefaultIcon");
defaultIco.SetValue("",iconPath);
defaultIco.Close();

//shell anahtarini belirliyoruz
RegistryKey shellKey = subKey.CreateSubKey("shell");
shellKey.SetValue("","open");

//shell keyi altina, open keyini tanimliyoruz
RegistryKey shellOpen = shellKey.CreateSubKey("open");
shellOpen.SetValue("","Ke&ndi uygulamam ile aç");

//son olarak open keyi altina, command keyini aciyoruz.
RegistryKey openCommand = shellOpen.CreateSubKey("command");
openCommand.SetValue("",applicationPath+" %1");

//sirayla actigimiz tum keyleri kapatiyoruz.
openCommand.Close();
shellOpen.Close();
shellKey.Close();
subKey.Close();
}
}
else
{
Console.WriteLine("Dosya uzantisi zaten iliskilendirilmis");
}
}

static bool isExists(RegistryKey key,string checkValue)
{
//aranilan keyin olup olmadigini denetliyoruz
if(key.OpenSubKey(checkValue) != null)
{
return true;
}
else
{
key.Close(); //kapatalim ki hataya sebep olmasin
return false;
}
}
Kodları tamamladıysak gelelim çalışma mantığına, uygulamamız her çalıştığında CreateRegistryValue metodunu çağırıyor, bu metod ise kabaca programımızın kayıt edeceği dosya uzantısının daha önce yaratılmış olup olmadığına bakıyor, eğer yoksa tüm düzenlemeleri ile yaratıp bizim için kullanıma hazır hale getiriyor.

Uygulamanın Denenmesi

Evet, uygulamayı tamamladığımıza göre şimdi geldik deneme safhasına.

Uygulamamızın doğru çalışıp çalışmadığını denemek için pek tabi ilk önce kendi dosyamızı oluşturmamız lazım. Bunun için açıyoruz notepad' i ve (boş olabilir önemli değil) rastgele birşeyler karalayıp "save as" (farklı kaydet) diyoruz. Aşağıdaki şekilde dosyamızı kaydediyoruz.




Böylece C:\ içerisinde deneme.abc adında bir dosyamız oluşturulmuş olacak.



Ve son olarak, dosyamıza çift tıklayarak açıyoruz. Programımızın ekran görüntüsü aşağıdaki gibi olacaktır.



Bu örnek uygulamadan yola çıkarak kendi programlarınıza istediğiniz dosyaları ilişkilendirebilirsiniz. Yapacaklarınız sadece bunlarla sınırlı değil tabi ki, birlikte aç menüsüne kendi programınızı ekleyebilmeniz buna bir örnek sayılabilir.

Saygılarımla..
 
Yukarı Alt