Home > Delphi > INI Dosya Yapısı ve Delphi İçinde Kullanımı

INI Dosya Yapısı ve Delphi İçinde Kullanımı

Posted on 22 Ocak 2007 | 2 Yorum

.INI dosyaları, kullanıcılar tarafından kolayca düzenlenebilen ve basit otomatik ayrıştırıcılar ile okunabilen, uygulama ayarlarını temsil eden text tabanlı bir yapıya sahiptir.

Windows kullanıcılarının bir çoğu .INI uzantılı dosyalara aşinadırlar. Örneğin Win.ini, System.ini. (Windows dizinini kontrol edebilirsiniz). Windows birçok önemli konfigirasyon bilgilerini hala bu tür dosyalarda saklı tutmaktadır.

Delphi ile “Yapılandırma Ayarları” Dosyalarına (.INI) Erişim

.INI dosyaları, kullanıcılar tarafından kolayca düzenlenebilen ve basit otomatik ayrıştırıcılar ile okunabilen, uygulama ayarlarını temsil eden text tabanlı bir yapıya sahiptir.

Windows kullanıcılarının bir çoğu .INI uzantılı dosyalara aşinadırlar. Örneğin Win.ini, System.ini. (Windows dizinini kontrol edebilirsiniz). Windows birçok önemli konfigirasyon bilgilerini hala bu tür dosyalarda saklı tutmaktadır.

Windows, uygulama ayarlarını saklanmasında Registry ‘ nin kullanılmasını önermesine rağmen hala birçok uygulamada .INI dosyalarına rastlamaktayız.

Basit bir .INI dosya uygulaması olarak, bir formun genişliğini ve pozisyonunu saklamayı gösterebiliriz. Formun bir sonraki gösteriminde, formun özellikleri .INI dosyasındakiler ile aynı olacaktır. Genelde butür bilgiler Registry de tutulmasına karşılık siz bunları INI dosyalarında da tutabilirsiniz.

.INI Dosya Yapısı

Konfigirasyon Ayarları dosyası (.INI), 64 kb ile sınırlı ve bölümlere ayrılmış text dosyalarıdır. Bu her bölüm sıfır veya daha fazla sayıda anahtar alan içerebilir. Ve her anahtar alanda sıfır veya daha fazla bir alana sahip olabilir. Bir örnek ile bu terim daha iyi anlaşlır olacaktır:

[BölümAdı] Anahtaradı=değer ;açıkalama satırı Anahtaradı=değer

Bölüm adı köşeli parantezler arasına alınır ve satır başında olmak zorundadır. Bölüm ve anahtar isimlerinin büyük küçük harf duyarlılığı yoktur ve boşluk karakteri içeremezler. Anahtar alanlarının ardından ise = işareti konur. Anahtar alanlardaki boşluklar system tarafından önemsenmezler.

Aynı dosya içinde birden fazla aynı bölüm olursa veya aynı bölüm içinde birden fazla aynı anahtar alan olursa, en sonuncusu varsayılan olarak atanır. Bir anahtar alan, string, integer veya bir boolean değer olabilir.

Delphi, INI dosya yapısını bir çok durum için kullanabilir. Örneğin, .DSK (Masaüstü ayarları) yukarıda tanımlanan bir dosya yapısına sahiptir.

TiniFile

Delphi, uygulamalarınızın belirli bilgilerini ve ayarlarını .INI dosyalarına saklamanız veya INI dosylarından isteklerinizi çağırabilmeniz için TIniFile sınıfını sunmaktadır. TiniFile sınıfı, inifiles.pas birimi(unit) içinde tanımlanmıştır. TiniFile ile çalışmadan önce bu sınıfı Uses kısmına ekleyip, bu sınıftan bir örnek oluşrumanız gerekir:

uses inifiles;
...
var  IniFile : TIniFile;
begin
IniFile := TIniFile.Create('ayarlar.ini');
...

Bu kod bir ‘ayarlar.ini’ adıyla IniFile nesnesi oluşturur ve bu sınıfın bütün özelliklerini size kullanıma açar.

Yukarıdaki kullanım ile oluşturacağınız ‘ayarlar.ini’ dosyanız, \Windows dizini altına oluşturulacaktır. Fakat yukarıdaki kodu aşağıdaki gibi değiştiriseniz, oluşacak olan .ini dosyanız, uygulamanızın çalıştığı dizine oluşturulur ve aynı zamanda ismide uygulamanız ile aynı adı alır. Bu şekilde bir kullanım çok daha verimli olacaktır:

// INI dosyasını uygulama ile aynı dizine koy,
// ve adını uygulmamın exe ismi ile bir yap.
IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));

Okuma

TIniFile sınıfı bir çok okuma metoduna sahiptir. ReadString, anahtar (key) alanlardan string değer okur, ReadFloat ve benzerleri, anahtar alanlardan rakam okumak için kullanılır. Bütün okuma metodları girilen değerlerin boş olması durumunda varsayılan bir değere sahiptirler. Örneğin ReadString metodu şöyle tanımlanmıştır:

Function ReadString(const Section, Ident, Default: String): String; override;

Yazma

TiniFile sınıfı her okuma metodu için bir yazma metoduna sahiptir. Başlıcaları; WriteString, WriteBool, WriteInteger gibi.

Örneğin şöyle bir isteğimiz olabilir; hazırlamış olduğumuz programın en son hangi kullanıcı tarafından kullanıldığı, ne zaman kullanıldığı, ana formun koordinatları. Bu isteğimize cevap alabilmek için bir Ini dosyası hazırlayabiliriz. Örneğin bu dosyamızın içeriği şöyle olsun;

[Kullanici]

SonKullanan=Mustafa KUTLU

Tarih=03/07/2004

[Koordinat]

Top=50

Left=20

Width=640

Height=480

Bu bilgilere de yukarıdaki ini dosyasındaki bilgilere de [Kullanici] bölümünden “SonKullanan” ve “Tarih” anahtar alanlarını ve [Koordinat] bölümünden de “Top”, “Left”, “Width” ve “Height” anahtar alanlarını çağırarak ulaşabiliriz.

Burada “SonKullanan” alanı string değer, “Tarih” kısmı TdateTime değer, Koordinat bölümündeki tüm alanlar ise integer tipi değer içermektedir. Aşağıda bu konula ilgili bir örneğin tam kaynak kodu bulunmaktadır. En yalın haliye bir INI dosya uygulamasını böyle yapabilirsiniz:

unit untInifile;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, inifiles, StdCtrls, ExtCtrls;

type
  TfrmAnaForm = class(TForm)
    edtKullanici: TLabeledEdit;
    lblTarih: TLabel;
    Tamam: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TamamClick(Sender: TObject);
  private
    procedure AyarOku;  //INI dosayımızdan ayarları okur
    procedure AyarKaydet;  //INI dosyamıza ayarları yazar
  public
    { Public declarations }
  end;

var
  frmAnaForm: TfrmAnaForm;

implementation

{$R *.dfm}

procedure TfrmAnaForm.AyarKaydet;
var
  Ayarlar: TIniFile;
begin
  //nesnemizi oluşturuyoruz
  Ayarlar := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
  //INI dosyamıza yazma işlemlerini yapıyoruz.
      //[Kullanici] bölümü
    Ayarlar.WriteString('Kullanici', 'SonKullanan', edtKullanici.Text);
    Ayarlar.WriteDate('Kullanici', 'Tarih', Date);
     //[Koordinat] kısmı
    with Ayarlar, frmAnaForm do
    begin
      WriteInteger('Koordinat', 'Top', Top);
      WriteInteger('Koordinat', 'Left', Left);
      WriteInteger('Koordinat', 'Width', Width);
      WriteInteger('Koordinat', 'Height', Height);
    end;
  finally
    Ayarlar.Free; //INI dosyamızı hafızadan sildik
  end;
end;

procedure TfrmAnaForm.AyarOku;
var
  Ayarlar: TIniFile;
  Tarih: TDate;
begin
  //nesnemizi oluşturuyoruz
  Ayarlar := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));

  //Eğer INI dosyamız mevcut ise okuma işlemi gerçkeleşir
  if FileExists(Ayarlar.FileName) then
  begin
    try
      //INI dosyamızdan okuma işlemlerini yapıyoruz.
       //[Kullanici] bölümü
      edtKullanici.Text := Ayarlar.ReadString('Kullanici', 'SonKullanan', '');
      Tarih := Ayarlar.ReadDate('Kullanici', 'Tarih', Date);
      lblTarih.Caption := DateToStr(Tarih);
       //[Koordinat] kısmı
      frmAnaForm.Top := Ayarlar.ReadInteger('Koordinat', 'Top', frmAnaForm.Top);
      frmAnaForm.Left := Ayarlar.ReadInteger('Koordinat', 'Left', frmAnaForm.Left);
      frmAnaForm.Width := Ayarlar.ReadInteger('Koordinat', 'Width', frmAnaForm.Width);
      frmAnaForm.Height := Ayarlar.ReadInteger('Koordinat', 'Height', frmAnaForm.Height);
    finally
      Ayarlar.Free;  //INI dosyamızı hafızadan sildik
    end;
  end
  else // Eğer INI dosyası bulunamaz ise tekrar oluşturluyor.
  begin
    AyarKaydet;
    AyarOku;
  end;
end;

procedure TfrmAnaForm.FormCreate(Sender: TObject);
begin
  AyarOku;
end;

procedure TfrmAnaForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  AyarKaydet;
end;

procedure TfrmAnaForm.TamamClick(Sender: TObject);
begin
  AyarKaydet;
end;

end.
 

Programın bir çıktı görüntüsü;

Bölümler ile Çalışmak

INI dosylarındaki bölümler ile çalışmanın birçok yolu mevcuttur. Örneğin EraseSection, INI dosyasındaki bölümlerin silinmesi için kullanılır. ReadSection ve ReadSections prosedürleri ile INI dosyanızdaki bütün bölümleri (ve anahtar isimlerini) bir TstringList e koyabilirsiniz.

Sınırlar ve Sıkıntılar

TiniFile sınıfı, INI dosya limiti olarak 64KB yi destekleyen Windows API’sini kullanmaktadır. Eğer 64KB daha fazla bilgi saklama ihtiyacı duyarsanız, TmemIniFile sınıfını kullanmanız gerekecektir. Bu sınıfın 64KB gibi bir sınırı yoktur.

Diğer bir probleminizde şu olabilir, bir bölümünüz 8K dan daha fazla bir değer içerebilir. ReadSection metodu, GetPrivateProfileString API fonksiyonunu kullanır ve bu API fonksiyonuda 8K bir buffer ile çalışır. Böyle bir durum karşısında çözüm; Kendi okuma fonksiyonunuzu yazmak olabilir.

Son olarak şu önemli noktaya değinebiliriz. INI dosylarına bütün kullanıcıların erişmesi mümkün olmaktadır. Bu demektir ki sakladığınız bilgiler tutarlı ve güvenli bir bütünlüğe sahip olmayacaktır. Aynı durum Registry içinde geçerlidir. Burada bir çözüm olarak da şunu önerebiliriz. Bilgilerinizi kendinizin geliştirmiş olduğu şifreleme algoritmaları saklamanız olacaktır. Ama unutmayın ki “Hırsıza kilit dayanmaz”.

 
» Tags: , , ,

2 Yorum

  • At 2008.12.31 03:53, Gökhan Bora said:

    Teşekkürler.

    • At 2009.02.08 16:15, İlker YEŞİLOÄžLU said:

      Teşekkürler.

      (Required)
      (Required, will not be published)

      Switch to our mobile site