Makale Özeti

Bu yazımda Ini dosyalarına en kısa şekilde nasıl erişir, değerlerini değiştirebiliriz bu konulardan bahsedeceğim.

Makale

Tüm yazılımcı arkadaşlara selamlar, 

Bu yazımda Ini dosyalarına en kısa şekilde nasıl erişir, değerlerini değiştirebiliriz bu konulardan bahsedeceğim.  

Masaüstü uygulaması geliştiren arkadaşlar yazılımın kişiselleştirilebilir ayarların kaydı için çeşitli yöntemler kullanmışlardır.Çoğumuz bazen text dosyalarını bazen de registry bölümlerini kullanmışızdır.Eğer geliştirdiğiniz yazılımın kişiselleştirilebilir ayarlarını admin müdahalesi olmadan başka bir dosyaya aktarabilecek bir arayüz geliştirmişseniz bu kayıtları registry'de tutmak aslında daha kolay olacaktır.Çünkü işletim sisteminin yeniden kurulması sonucu kullanıcının kişiselleştirilebilir ayarlarını kaybetmemesi için bu ayarların yedeklenmesi/tekrar yüklenebilmesi gerekir.

Fakat müdahale şansımızın olmadığı durumlarda basit kullanıcıların bu tür durumlarda daha kolay kullanabilecekleri bir yöntem mevcut.Ayarları text dosyasına
yazmak.Bu yöntem'in yedeklenme ve tekrar yüklenme işlemi registry'den daha basittir ama ayar dosyalarının çok büyümesi durumunda da programımız yavaşlayacaktır.Çünkü istediğimiz ayarı bulana kadar text dosyasını baştan sona okumak zorundayız.

İşte bu durumda kullanabileceğimiz başka bir yöntem daha mevcut.O da ini dosyaları.

Ini dosyaları'nin üç üyeden oluşmaktadır. Section Key ve Value 
Section değerini bir başlık olarak düşünebilirsiniz.Aynı amaca hizmet eden farklı key'leri barındırır.
Key ler ise tutmak istediğimiz değerlerin isimleridir.Value ise değerin kendisidir. Örnek vermek gerekirse

[SMTP]
Timeout=40
Port=25
Server=mail.somemta.com

Burda SMTP section, Timeout Key ve 40 ise Value dur.

Evet ini dosyaları text dosyalarından daha derli toplu gözüküyor fakat erişimde nasıl bir farkı olabilir ki.
Text dosyalarını okuduğumuz yöntemle aynı şekilde okuyacağız.Üstelik bir de Section değerinin kontrolünü yapacağız bu text den daha yavaş olacak???

Ini dosya formatı bir Windows standardı olduğundan dolayı sistemde bu konu ile ilgili API'ler mevcut.
Unutmayın , eğer sistemde yapmak istediğimiz işlemi yapan bir API mevcut ise Amerikayı baştan keşfetmeye gerek yok :)
Üstelik API kullanırsak hatırı sayılır bir hız kazanırız.

Windows ini dosyalarıyla işlem yapmamız için bize iki API sunar.
WritePrivateProfileString ve GetPrivateProfileString

isimlerinden de anlaşıldığı gibi writeprivateprofilestring ini dosyalarına değer yazmamız getprivateprofilestring ise değer okumamız içindir.

c#'da api kullanımı için System.Runtime.InteropServices isimalanını projemize eklememiz gerekmektedir.

İlk önce WritePrivateProfileString'i inceleyelim.

[DllImport("kernel32")]
private static extern long
WritePrivateProfileString(string section,string key,string val,string filePath);

bu api 4 parametre almaktadır.Section,key,val parametreleri string türündendir ve yukarıda bahsettiğim gibi ini dosya bileşenleridir.filePath ise ini dosyasının bulunduğu dosya yolunu ve ismini içermelidir.

[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,string key,string def, StringBuilder retVal,int size,string filePath);


bu api ise 6 parametre almaktadır.İlk api'nin parametrelerinden farklı olarak def; bir değer bulunamazsa geri döndürülecek varsayılan değeri, retVal okunan değeri, size okunacak değerin uzunluğunu bildirir.

İsterseniz şimdi aşağıdaki örnek projeyi inceleyelim.

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace HandlingIniFiles
{
	public class RWIniFiles
	{
		string mvarstrIniFile="";

		[DllImport("kernel32")]
		private static extern long WritePrivateProfileString(string section,
			string key,string val,string filePath);
		[DllImport("kernel32")]
		private static extern int GetPrivateProfileString(string section,
			string key,string def, StringBuilder retVal,
			int size,string filePath);

		public RWIniFiles()
		{
		}
		public string ReadIni(string Section,string Key)
		{
			StringBuilder stbINI = new StringBuilder(255);
			GetPrivateProfileString(Section,Key,"",stbINI,255,mvarstrIniFile);
			return stbINI.ToString();
		}
		public void WriteIni(string Section,string Key,string Value)
		{
			WritePrivateProfileString(Section,Key,Value,mvarstrIniFile);
		}
		public string IniFile
		{
			get{return mvarstrIniFile;}
			set{mvarstrIniFile=value;}
		}
	}
}

RWIniFiles sınıfının 3 üyesi mevcuttur.ReadIni,WriteIni ve IniFile. 

ReadIni metodunda stbINI isminde bir stringbuilder nesnesi yarattık.Bu nesne hatırlarsanız getprivateprofilestring'in aldığı stringbuilder nesnesidir.
API'ye gönderdiğimiz bu nesne api tarafından içi istediğimiz section ve key bölümünde bulunan veri ile doldurulur ve geri döndürülür.

WriteIni metodunda ise gördüğünüz üzere hiçbir ekstra işlem yapmadan parametrelerimizi göndererek istediğimiz değeri yazdırabiliyoruz.
Sınıfın nasıl çalıştığını test etmek için aşağıdaki kodu kullanabilirsiniz.

RWIniFiles rwini=new RWIniFiles();
rwini.IniFile=@"C:\\Settings.ini";
Console.WriteLine( rwini.ReadIni("SMTP","Timeout").ToString());
rwini.WriteIni("","Timeout","Test3");

Umarım yararlı olmuştur.Bir sonraki makalede görüşmek üzere.

Levent YILDIZ
Gulf Agency Company – TURKEY
IT Manager
MCP
msmoracle@hotmail.com
levent.yildiz@gacworld.com
http://www.gacworld.com

Örnek proje