Makale Özeti

XML’in .Net teknolojisi içerisinde tamamen gömülürcesine entegre edilmesi, Microsoft’un İşletim sistemlerinde Konfigürasyon dosyası standardı halini alan .ini dosyaların tamamen unutulmasını gündeme getirmişti. Ancak XML kadar güvenilir veri tutamasa da hem kapasite hem de okunabilirlik ve düzenlenebilirlik açısından XML dosyalarından çok daha Kullanışlı olduğunu düşünüyorum. Bu makaleyi neden yazma gereksinimi duydum? Çünkü ben ihtiyaç duydum ve hiçbir yerde konu ile ilgili doküman bulamadım. (: CE Turk ve CodeGuru ya Teşekkür etmek gerek sanırım :)

Makale

Eski Dostumuz .Ini Dosyalar.

 

Microsoft .Net teknolojisinin gelişmesi ve artık uygulamalarda standart hale gelen ve nerdeyse bütün dillerin Kayıtsız şartsız destek verdiği XML teknolojisi, programlarda kullandığımız Alt Seviye Ayarlama, Setup Yapılandırmaları, Basit Konfigürasyonlardan, Web de bilgi taşımak dahil olmak üzere projenin nerdeyse her aşamasında karşımıza çıkar oldu. Öyle ki birbiriyle konuşan tamamen farklı diller ve platformlarda yazılmış 2 uygulama birbirleriyle XML standartları üzerinden konuşur hale geldi. Tabi konumuz XML’in üstünlükleri ve Kullanım alanları olmadığından bu kısmı kısa geçiyorum. (:

 

XML’in .Net teknolojisi içerisinde tamamen gömülürcesine entegre edilmesi, Microsoft’un İşletim sistemlerinde Konfigürasyon dosyası standardı halini alan .ini dosyaların tamamen unutulmasını gündeme getirmişti. Ancak XML kadar güvenilir veri tutamasa da hem kapasite hem de okunabilirlik ve düzenlenebilirlik açısından XML dosyalarından çok daha Kullanışlı olduğunu düşünüyorum. Bu makaleyi neden yazma gereksinimi duydum? Çünkü ben ihtiyaç duydum ve hiçbir yerde konu ile ilgili doküman bulamadım. (:

 

Gel Gelelim Asıl konumuza. .ini dosyaları nasıl okunur ve nasıl yazılır. Bunu MS .Net  dillerinden hiç birisi otomatik olarak varsayılan şekilde yapmıyormuş. Her halükarda Windows API(Application Programming Interface) lerinden yararlanmamız gerekiyor muş.

 

Ben yazacağım örnek uygulamanın dilini Java’ya yakınlığından dolayı C# olarak seçtim.

 

Şimdi Kullanacağımız Api leri nasıl uygulamaya ekleyeceğimizi öğrenelim. En başta Api Kullanacağımız için Uygulamamıza

 

using System.Runtime.InteropServices;

 

namespaces’ini ekliyoruz. Bu vazgeçilmez (:

 

Daha Sonra ilgili Api lerin olduğu DLL dosyalarını uygulamaya ekleyebilmek için

[DllImport(“dll dosyası adı”)]

Attributunu kullanarak gerekli dosya-api ilişkilendirmesini yapıyoruz.

Nasıl? İşte Şöyle.

 

[DllImport("kernel32")]

        private static extern long WritePrivateProfileString(string strSection,

            string strKey, string strVal, string strDosya);

[DllImport("kernel32")]

            private static extern int GetPrivateProfileString(string strSection,

                  string strKey,string strDef, StringBuilder retVal,

                  int iSize,string strDosya);       

 

şimdi biz ini dosya yazıp okumak için 2 adet Windows Api sini ekledik. Apileri nerden buldum sorusu gerçekten karışık. Lise Yıllarında ApiGuide diye bir program vardı onun içinde Api ve parametreleri gayet güzel gösteriliyor.

 

Şimdi Bu ini dosya nedir? Biz nerde ki değerleri okuyacağız, Nereye Değer Yazacağız?

 

[Server]
LocalPort=1234

LocalServerName=Ertugrul

SQLServerName=local

DataBaseName=Deneme

 

Şimdi yukarda basit bir ini dosya yapısı görünüyor zaten. Kısaca [Server] yazan kısım bizim Okuyacağımız değerlerin olduğu Bölüm (Section), LocalPort, LocalServerName gibi bilgilerin olduğu Kısımlar okuyacağımız Anahtarlar (Key) ve 1234, Ertugrul değerlerinin yazılı olduğu yerler ise değerlerimizi (value) temsil ediyor.

 

Gelelim Programımıza :)

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices; //Eklememiz Gereken NameSpace

 

namespace IniDeneme

{

    class clsIniModulu

    {

        string IniDosyaYolu="";

 

        //Ini Yazmak için gerekli Api

            [DllImport("kernel32")]

        private static extern long WritePrivateProfileString(string strSection,

            string strKey, string strVal, string strDosya);

            [DllImport("kernel32")]

 

        //iniden okumak için gerekli Api

            private static extern int GetPrivateProfileString(string strSection,

                  string strKey,string strDef, string retVal,

                  int iSize,string strDosya);

 

        //Yapıcı Metodumuz

        public clsIniModulu()

            {

 

            }

 

        /*

         * Aşırı Yüklenmiş 2 Yapıcı Metodumuz

         * Aslında Yazmamıza gerek olmayan bir metod

         * ancak ben nesne oluşurken özellikle Tek propertye

         * değer aktarımı söz konusuysa bu şekilde kullanmayı tercih ederim.

         * Her Yiğidinde Bir Yoğurt Yiyişide var elbet (:

        */

        public clsIniModulu(string DosyaYolu)

        {

            IniDosyaYolu = DosyaYolu;

        }

 

        //Nesnemizin Okuyacağı veya Değiştireceği İni Dosyamız

        //Property Olarak Tanımlı

        //Java'daki Setter & Getter Metodlara Benziyormuş :p

        public string IniDosya

        {

            get

            {

                return IniDosyaYolu;

            }

            set

            {

                IniDosyaYolu = value;

            }

        }

 

        /*

         * Gelelim Kuru Fasülyenin Faydalarına

         * Okuma Metodu aşağıdaki gibi, çok teferruatlı bir yanı yok aslında :)

         * Bölüm ve Okuyacağım Key Bilgilerini Motod parametresi olarak alıp

         * Api Parametrelerine gönderiyorum. Sonuç String olarak geri bana geliyor.

         */

            public string IniDosyaOku(string Bolum,string Degisken)

            {

            string strDeger;

            GetPrivateProfileString(Bolum, Degisken, "", strDeger, 255, IniDosyaYolu);

            return strDeger;

            }

 

        /*

         * Yine Bu Metodda Parametre listesinden aldığı değerleri ilgili Apiye

         * Aktararak yazma işlemini gerçekleştirir. (:

         */

        public void IniDosyaYaz(string Bolum, string Degisken, string Deger)

            {

            WritePrivateProfileString(Bolum, Degisken, Deger, IniDosyaYolu);

            }

 

    }

 

    public class AsilProgram {

 

        static void Main(string[] args)

        {

            clsIniModulu mdl = new clsIniModulu(@"\Deneme.ini");

            //Nesnemizin Örneğini alıp Doğrudan Dosyamızı belirttik.

 

            Console.WriteLine(mdl.IniDosyaOku("Server", "LocalPort"));

            //Programla Ayni Dizinde olduğunu varsaydığımız dosyamızdaki Server

            //Bölümünden LocalPort değerini okuduk ve yazdırdık.

 

            Console.WriteLine(mdl.IniDosyaOku("Server", "LocalServerName"));

            // Server Bölümünden LocalServerName değerini okuduk ve yazdırdık.

 

            mdl.IniDosyaYaz("Server", "LocalPort", "4321");

            // Server Bölümünden LocalPort değerini okuduk ve yazdırdık.

 

            Console.WriteLine(mdl.IniDosyaOku("Server", "LocalPort"));

            //Değişen değeri tekrar okuduk ve ekrana gösterdik

 

            Console.ReadLine();

        }

 

    }

}