.INI Dosyaları ile Ayar saklamak

.INI Dosyaları ile Ayar saklamak

Merhabalar bazen uygulama geliştirirken küçük ayarları tutmak isteriz ancak bu ayarları kaydetmek için veritabanımızda tablo oluşturmak ve ulaşmak için Business Object oluşturmak zahmetli olacaktır böyle durumlar için C# bize bir kolaylık sağlıyor; .INI dosyaları. INI dosyası aslında bir text dosyasıdır ve içerisinde kayıtlarımız satırlar içinde Key=Value çifti şeklinde barındırılır, buna ek olarak [Section] adı verilen gruplar da oluşturulabilmektedir. bu gruplar sayesinde sayfa ayarlarınızı bir grupta grid ayarlarınızı başka bir grupta saklayabilirsiniz.

Bu işlemi yapabilmek için projemize DLLImport ile iki adet extern method eklememiz gerekiyor.

[DllImport("kernel32")]
static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);

[DllImport("kernel32")]
static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

bu iki method sayesinde bir ini dosyasına (bu dosya yolunu kendimiz vereceğiz) ayar kaydedip ayar yazabileceğiz.

Method ların çok fazla alan istediğini görüyoruz ve bu alanları sürekli olarak girmek  hataya sebep olacaktır, bu yüzden Bir class oluşturup static methodlar ile işlemimizi daha kolay hale getirebiliriz. Oluşturduğumuz bu class içine iki adet DllImport işlemini yapacağız.

public static class Ayarlar
{
    [DllImport("kernel32")]
    static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);

    [DllImport("kernel32")]
    static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);


}

bu aşamada methodlarımız hazır ancak bir dosya yoluna ihtiyacımız olduğunu görüyoruz. Dosyamız elbette çalışacak olan .exe dosyamız ile birlikte olmalı. bunu bir property ile çözebiliriz.

static string AyarKonum
{
    get
    {
        string exeKonum = Assembly.GetExecutingAssembly().Location;
        string exeKlasor = Path.GetDirectoryName(exeKonum);
        string ayarKonum = string.Format("{0}\\ayarlar.ini",exeKlasor);
        if (!File.Exists(ayarKonum))
        {
            File.Create(ayarKonum);
        }
        return ayarKonum;
    }
}

bu property i public yapma ihtiyacı duymadık çünkü dışardan erişileceğini düşünmüyoruz. konum için Assembly.GetExecutingAssembly().Location; ile çalışan uygulamanın konumunu aldık ancak bize exenin konumu değil klasörü lazım. Tam bu noktada Path sınıfı yardımımıza koştu. Path sınıfı dosya yolları üzerinde işlem yapmamızı sağlar. örneğimizde Path.GetDirectoryName(exeKonum);  ile yoldan klasör konumunu elde ettik ve ayar dosyasını ucuna eklemeye hazırız. string.Format(“{0}\\ayarlar.ini”,exeKlasor);  ile de ayar dosyamızı konuma iliştirdik. Lakin böyle bir dosya hiç olmayabilir. Dosyanın varlığını garantilemek amacıyla da  if (!File.Exists(ayarKonum)) komutumuz ile dosya varmı diye kontrol etmiş olduk. Eğer dosyamız yok ise File.Create(ayarKonum); komutu ile dosyamızı oluşturduk. Dosya zaten var ise sorun yok property miz konumu düzenleyip bize verecek.

Pekii konumu sabitlediğimize göre kendimize basitçe okuma ve yazma yapacağımız method lar yazmanın zamanı geldi. elbet ki uygulama içinde hızlıca ayarlara ulaşmak istiyoruz Zira birçok ayarımız olacak ve sadece adını söyleyerek bunları getirebilmeliyiz.  Öncelikle Okuma işlemi için bir method geliştirelim.

public static string Oku(string Key, string Section = "Ayarlar")
{
    var ayarDeger = new StringBuilder(255);
    GetPrivateProfileString(Section, Key, "", ayarDeger, 255, AyarKonum);
    return ayarDeger.ToString();
}

Bu method bizim hızlı bir şekilde Ayar okuyabilmemizi sağlayacak zira Ayar.Oku(“BaslangictaAcil”); diyerek verdiğimiz ayarın bilgisini alabilmemizi sağlayacak. Peki bu nasıl oldu? öncelikle string Section=”Ayarlar” şeklinde tanımlanan Section parametresine dikkat edelim parametreye default bir değer verdik bu sayede hiçbir section belirtmez isek Ayarlar isimli section(grup) içindeki verdiğimiz Key(ayarın adı) değerini okuyacak. GetPrivateProfileString metodunun parametrelerine bakarsak önce section(grup) değerini istiyor. daha sonra okunacak olan alanın adını(key) istiyor. 3. parametre olarak verdiğimiz “” değeri varsayılan(default) değeri kastetmektedir, yani eğer hiçbir kayıt bulamazsa burada verdiğimiz değer gelecektir. ben rastgele bir değer gelmesindense String.Empty gelmesini tercih ediyorum böylelikle kontrol edebilirim. ayarDeger değişkeni ise aslında okuduğumuz kaydın deger(value) alanını içeriyor. peki method ne döndürüyor? int bir değer. bu okuduğu bilginin kaç karakter olduğunu iletiyor. Ancak bilgiyi istersek ona bir StringBuilder göndermeli ve method StringBuilder değişkenine değerimiz konulacaktır. Bizde bu degeri geri dönebildik.

Öyleyse sıra ayar dosyamıza kayıt eklemeye geldi.

public static void Yaz(string Key, string Value, string Section = "Ayarlar")
{
    WritePrivateProfileString(Section, Key, Value, AyarKonum);
}

Yaz komutu bizim için daha kısa ve uysal görünüyor. Oku methodunda yaptığımız gibi Section için parametrede default(varsayılan) değer tanımı yaptık. bu sayede eğer Section gönderilmez ise Section parametresinde “Ayarlar” değeri hazır bulunacak. bizde Key(ayar adı) ve Value(kaydedilecek bilgi) bilgilerini methodumuza vereceğiz ve harddiskimizde oluşan bu dosyanın içinde bilgilerimizi rahatça saklayabileceğiz.  Bu işlemleri yaparken AyarKonum Değişkenimizin bir property olduğunu ve ismi hesaplayarak getirdiğini de hatırlayalım.

Ayarı kaydettik ve okuduk.  Ancak C# ta bulunan indexer özelliği ile daha hızlı bir şekilde ayarı getirebiliriz.

Kodumuzun son hali aşağıdaki gibi olmuş oldu

public static class Ayarlar
{
    [DllImport("kernel32")]
    static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);

    [DllImport("kernel32")]
    static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

    static string AyarKonum
    {
        get
        {
            string exeKonum = Assembly.GetExecutingAssembly().Location;
            string exeKlasor = Path.GetDirectoryName(exeKonum);
            string ayarKonum = string.Format("{0}\\ayarlar.ini", exeKlasor);
            if (!File.Exists(ayarKonum))
            {
                File.Create(ayarKonum);
            }
            return ayarKonum;
        }
    }

    public static string Oku(string Key, string Section = "Ayarlar")
    {
        var ayarDeger = new StringBuilder(255);
        GetPrivateProfileString(Section, Key, "", ayarDeger, 255, AyarKonum);
        return ayarDeger.ToString();
    }
    public static void Yaz(string Key, string Value, string Section = "Ayarlar")
    {
        WritePrivateProfileString(Section, Key, Value, AyarKonum);
    }        

}

 

umuyorum ki sıkmadan ayrıntılı bir şekilde anlatabilmişimdir.

 

Habip Oğuz

İlgili Yazılar
Cevap yaz