C# INI Ayar Dosyası Oluşturma – Kernel32.dll, yazımız ile c# eğitimlerine devam ediyoruz. Bu dersimizde projemizin kendisine bir ini dosyası oluşturmasını sağlıyoruz. C# ini dosyası konfigürasyon (ayar) ayarlarının saklandığı bir dosyadır. Bir metin belgesi açıp, uzantısını ini yapıp içerisine istediğimiz şeyleri yazabilir, stream reader ile de okuyup işlemlerimizi yaptırabiliriz. Ancak! Bu dersimizde bu işlemi daha profesyonel şekilde yapmış olacağız. Sizlerde merak ettiyseniz gelin C# INI Ayar Dosyası Oluşturma – Kernel32.dll dersimize geçelim.
C# INI Ayar Dosyası Oluşturma – Kernel32.dll
Bu dersimiz ile oluşturacağımız ini dosyasının görüntüsü şu şekilde olacaktır.
Soldaki görselde gördüğünüz gibi bir dosya elde etmiş olacağınız. Sonuçta elimizde bir nevi parametre tablosu olacak.
Kırmızı alanda gösterilen köşeli parantezler arasında olan kısımı tablo başlığı olarak;
Mavi alanda gösterilen kısım kolon başlığı olarak;
Yeşil alanda gösterilen kısım ise veri olarak düşünürsek mantıklı geliyor değil mi?
İşte biz bunu elle değil program üzerinden oluşturacağız.
Her ne kadar tablo gibi desem de bunu bir parametre tablosu olarak düşünün. Tek parametre ve parametre değeri olan bir tablo. Kırmızı alandaki kısım Parametre grubu, mavi alandaki kısım parametre adı, yeşil kısımdaki alanda parametre değeridir.
Merak edenler için, görseldeki işlemi öğrenci kayıt esnasında istenecek verileri göstermesini istediğim bir form için tasarladım. Öğrenci kayıt esnasında, kurumun seçtiği bilgiler (Checked olanlar) ekranda görülecektir.
Başlıkta da belirtildiği gibi C# ini dosyası okuma işlemini windows sisteminin kendi dll i olan Kernel32.dll ile yapacağız. İlk olarak Dosya oluşturma ve yazmayı görelim.
Öncelikle bu kodların çalışabilmesi için aşağıdaki namespace’i ekliyoruz.
using System.Runtime.InteropServices; using System.Text;
C# INI Ayar Dosyası Oluşturma, Yazma – Kernel32.dll
Şöyle bir ekran yapalım, yada düşünün… :D
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName); bool WriteINI(string SectionName, string KeyName, string StringToWrite, string INIFileName) { bool Return; Return = WritePrivateProfileString(SectionName, KeyName, StringToWrite, INIFileName); return Return; }
Yukarıdaki kodlarımız bizim için dosya yoksa açıyor, dosya var ise dosyayı açıp içerisine yazma işlemini yapıyor.
SectionName = Bu parametre yukarıdaki görselde görünen kırmızı alanı ifade ediyor.
KeyName = Bu parametre yukarıdaki görselde görünen mavi alanı ifade ediyor.
StringToWrite = Bu parametre yukarıdaki görselde görünen yeşil alanı ifade ediyor.
INIFileName = Bu parametre INI dosyasının yolunu ifade ediyor.
Evet yazma işlemimiz bu kadardı. Şimdi INI dosyası okuma işlemini görelim.
C# INI Ayar Dosyası Okuma – Kernel32.dll
[DllImport("kernel32.dll")] static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); private string veriOku(string anabaslik, string altbaslik) { StringBuilder sb = new StringBuilder(5000); GetPrivateProfileString(anabaslik, altbaslik, "", sb, sb.Capacity, @"C:\Config\Config.ini "); string alinan = sb.ToString(); sb.Clear(); return alinan; }
Bu kodlarımız ise config.ini dosyasına yazdığımız verileri okuyabilmemizi sağlıyor.
C# INI Ayar Dosyası Okuma
Şimdiiiiiii! İşin en civcivli kısmına geldik. Bu kodları heryerde bulabilirsiniz ancak buradan sonraki kodları her yerde bulamazsınız.
Senaryo yukarıda bahsettiğimize benzer olsun. Diyelimki bir formunuzda 100+ checkbox var ve benim yaptığım gibi bir config.ini dosyası yapmak istiyorsunuz.
Ek Bilgi: Mesela önceki dersimde C# Encrypt – Decrypt anlatmıştım. Burada verileri yazarken bu şifrelemeyi kullanarak şifreli de yazabilirsiniz. ;)
Normal yollarla giderseniz bu formunuzun kod kısmında 100+ checkedChanged eventi olacak ve 100+ bu parametreleri okuma satırınız olacak. Pihüüüüüü…. :D
Tabi öyle olmayacak. 25 satır kadar okuma işlemi, 25 satır kadar da yazma işlemi için kod yazmış olacağız. (Bu ne kadar ana başlık oduğuna göre değişir. Bende 4 ana başlık var.)
Buradaki püf nokta şudur, CheckBox’ların hem Text hemde Tag özelliklerini kullanacağız. Yani, ana başlıkları (görseldeki kırmızı alan) Tag özelliğine, alt başlıklarını da (görseldeki mavi alan) Text özelliğine yazacağız. CheckBox’un seçili olması yada olmaması da bizim değerimiz olacak (görseldeki yeşil alan).
Öncelikle okuma metodumuz verelim. Tabi yukarıda verdiğim okuma ve yazma kodları formda olması gerek.
NOT: Burada CheckState türünde dönüş veren 1 overloaded metodum vardır. İlk önce onu vereyim. Ha bu metodlar işin biraz fantezisi gibi ama sonrasında bana fayda sağlamaktadır. Daha aşağıda okuma ve işaretleme işleminde kodlarımızı ne kadar kısalttığını göreceksiniz. Bu metod sayesinde gönderdiğim veriyi düşünmeme gerek kalmıyor. CheckState türüne dönüştürülebilecek bir değer ise kesinlikle hata almayacağım. Daha farklı bir değer geldi ise proje patlamayacak ve nazikçe uyaracaktır. Bu uyarı ile de ben gönderilen veri neden hatalı onu daha rahat bulabileceğim.
public static CheckState Check(int i) // metoda gelen değer int ise bu metod çalışır { CheckState c = new CheckState(); switch (i) { case 0: // int olarak 0 ise işaretleme yapma c = CheckState.Unchecked; break; case 1: c = CheckState.Checked; break; default: MessageBox.Show("Hatalı Değer Gönderdiniz. Değer: "+ i.ToString()); break; } return c; } public static CheckState Check(string s) // metoda gelen değer string ise bu metod çalışır { CheckState c = new CheckState(); switch (s) { case "0": // string olarak 0 ise işaretleme yapma c = CheckState.Unchecked; break; case "1": c = CheckState.Checked; break; case "Unchecked": // string olarak Unchecked ise işaretleme yapma c = CheckState.Unchecked; break; case "Checked": c = CheckState.Checked; break; case "false":// string olarak false ise işaretleme yapma c = CheckState.Unchecked; break; case "true": c = CheckState.Checked; break; case "False": // string olarak False ise işaretleme yapma c = CheckState.Unchecked; break; case "True": c = CheckState.Checked; break; default: MessageBox.Show("Hatalı Değer Gönderdiniz. Değer: " + s.ToString()); break; } return c; } public static CheckState Check(bool b) // metoda gelen değer bool ise bu metod çalışır { CheckState c = new CheckState(); switch (b) { case false: // bool olarak false ise işaretleme yapma c = CheckState.Unchecked; break; case true: c = CheckState.Checked; break; default: MessageBox.Show("Hatalı Değer Gönderdiniz. Değer: " + b.ToString()); break; } return c; }
Bu metodu da verdikten sonra asıl işleme geçelim.
void Chk_Bilgileri_Oku() { // DevExpress kullandığımdan CheckEdit, Windows nesnelerinde CheckBox'tur. string tag = string.Empty; // tag adında bir değişken oluşturduk foreach (CheckEdit item in this.Controls) // fromdaki tüm checkbox ları geziyoruz. { tag = item.Tag.ToString(); // bulunan checkedit'in tag özelliğinde yazan ana başlığı aldık. switch (tag) { case "Öğrenci Genel Bilgiler": item.CheckState = Metodlar.Global.Check(veriOku(tag, item.Text)); break; case "Öğrenci Devam Bilgiler": item.CheckState = Metodlar.Global.Check(veriOku(tag, item.Text)); break; case "Öğrenci Anne Bilgiler": item.CheckState = Metodlar.Global.Check(veriOku(tag, item.Text)); break; case "Öğrenci Baba Bilgiler": item.CheckState = Metodlar.Global.Check(veriOku(tag, item.Text)); break; } } }
İşte bu kadar. Formunuzda isterse 500 tane checkbox olsun. Bu kodlar ile okuyup işaretlemesini yapabilirsiniz. Bende şuan 4 ana grup olduğundan bu şekilde isteseydim tek ana grup altında toplar, yukarıdaki kodlardan 3 case’i de silebilirdim.
Her zaman demek istediğim şey budur dostlar. Kodlarımızın hata vereceğine dair bir şüphemiz var mı? Yok. Hepi topu 25, 30 satır kod. Hata çıksa bile kontrol edeceğimiz yer bu kadar. Bu voidimizi de form loadda yada oku butonu click eventi altında çalıştırıyoruz. Hepsi bu kadar.
Profesyonellik çok kod yazıp az iş yaptırmak değil, az kod yazıp çok iş yaptırmaktır. Mustafa BÜKÜLMEZ.
C# INI Ayar Dosyası Oluşturma, Yazma
Config.INI dosyamıza veri yazmaya geldi sıra. Bu işlemde çok kısa. Okuma ve işaretleme işleminden farklı olarak her grup için bir checkBox_CheckedChanged eventi yazacağız. Yani 4 ana grup için 4 event yeterli oluyor. :D
private void chk_CheckedChanged(object sender, EventArgs e) { // sender parametresi, bu eventi atadığımız nesneyi tüm özellikleri bize getirir. // Ancak bu direk event ataması yaptığımız nesneyi değil, ilgili nesneyi object olarak gönderir. CheckEdit chk = sender as CheckEdit; // Bu senderden gelen object aslında bir checkedit olduğundan yukarıdaki atama işleminden bir hata almıyoruz. WriteINI("Öğrenci Genel Bilgiler", chk.Text, chk.CheckState.ToString(), BtClass.Tk.glbsystem.AppPath + "\\Config.ini "); } private void chk_2_CheckedChanged(object sender, EventArgs e) { CheckEdit chk = sender as CheckEdit; WriteINI("Öğrenci Devam Bilgiler", chk.Text, chk.CheckState.ToString(), BtClass.Tk.glbsystem.AppPath + "\\Config.ini "); } private void chk_3_CheckedChanged(object sender, EventArgs e) { CheckEdit chk = sender as CheckEdit; WriteINI("Öğrenci Anne Bilgiler", chk.Text, chk.CheckState.ToString(), BtClass.Tk.glbsystem.AppPath + "\\Config.ini "); } private void chk_4_CheckedChanged(object sender, EventArgs e) { CheckEdit chk = sender as CheckEdit; WriteINI("Öğrenci Baba Bilgiler", chk.Text, chk.CheckState.ToString(), BtClass.Tk.glbsystem.AppPath + "\\Config.ini "); }
İşte kodlarımız bu şekilde. Bu kısmına okuma ve işaretleme deki gibi yapabilirdik aslında ama o anda böylesi aklıma yattı. O yüzden bu şekilde yaptım. Burada son işlem olarak, Öğrenci Genel Bilgiler grubunda olan chechBox’ların checkedChange eventine ilk sıradaki eventi atıyoruz. Bunu da gruptaki tüm checkbox’ları seçip özellikler sayfasından sonra da eventler sayfasına gelip, checkedChange eventi kısmına tıklayarak formdaki eventler içinden ilgili eventi seçiyoruz. Yani tek bir eventi birden fazla nesne için kullanmış oluyoruz.
Bu şekilde formu açıp bir checkBox’a her tıkladığımızda önce yazma sonra da okuma işlemi yapmış oluyor. Ve her seferinde ilgili alanı değiştiriyor. Yani önce silip sonra tekrar yapmıyor. Her seferinde update yapmış oluyor.
C# INI Ayar Dosyası Oluşturma – Kernel32.dll , yazımızda bu kadar dostlar. Uzun, güzel ve sağlam bir yazı oldu. Bu dersimizde bir çok konuya tekrar değinmiş olduk ve bence çok farklı bir kod yazım şekli ve mantığı görmüş oldunuz. Burada yazan yöntemler benim birebir ve aktif olarak kullandığım yöntemlerimdendir.
Kısaca bu dersimizde nelere değindik tekrar göz atalım.
- Overloaded metodlar,
- Dinamik nesne kullanımı
- Bir eventi birden fazla nesnede kullanma
- Kernel32.dll dosyasını kullanma
- İni dosyası oluşturma, okuma ve yazma
- CheckState türünde değer döndüren metod kullanımı
- Modüler çalışma
- Nesne özelliklerini kullanma
7 farklı konuyu tek ders içerisinde vermiş olduk. Umarım sizler içinde faydası olmuştur.
C Sharp Eğitim Seti ve ERP Programlama ders listesi için tıklayınız.
Takipte ve Sağlıcakla Kalın.
Merhaba ;
Anlatımlarınızdan yola çıkarak aşağıdaki uygulamayı yaptım fakat yerel disk “c”ye .ini dosyası açılmıyor.Sorun neyden kaynaklı acaba ?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
//using System.Text;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport(“kernel32.dll”, CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
bool WriteINI(string SectionName, string KeyName, string StringToWrite, string INIFileName)
{
bool Return;
Return = WritePrivateProfileString(SectionName, KeyName, StringToWrite, INIFileName);
return Return;
}
private void buttonSqlBilgiKaydet_Click(object sender, EventArgs e)
{
WriteINI(“Ayarlar”, “Server Name”,textBoxServerName.Text, “C:Ayarlar.INI”);
MessageBox.Show(“Kayıt Eklendi”);
}
}
}
Selamlar,
WriteINI(“Ayarlar”, “Server Name”,textBoxServerName.Text, “C:\\Ayarlar.INI”);
arada slash atmanız gerekiyor. ^^ bu gibi işlemlerde önce ilgili klasörü açıp adres çubuğunda yazan kısmı kopyalayıp kullanın.
Merhaba, Konu çok yardımcı oldu teşekkür ederim.Bir sorun olacaktı .ini dosyamda [Menuler] altında
Menu1= ile başlayıp Menu10= kadar devam eden bilgiler var kod içerisinde bunları teker teker girmek yerine hepsini bir string içine nasıl alabilirim?.
Merhaba,
Aralara virgül veya kolayca ayrıştırılabilecek bir atarsınız. Tamamını tek string olarak okur içeride split ile belirlediğiniz ayraçlara göre parçalarsınız.