Loading...

7 Haziran 2007 Perşembe

Bir dizin içindeki dosyaların bulunması || C#

Merhaba bu yazımızda günümüz işletim sistemlerinin temeli olan dosya bulma kavramını göreceğiz.Özellikle Windows ve Linux türevi işletim sistemlerinde özel bir dosya türü vardır. Bu dosya türü genellikle klasör olarak bilinir.Klasör dışındaki diğer dosyalar klasörler içinde saklanabilir. Bir dosyanın işletim sistemi modülü içinde bulunabilmesi için dosyanın dereceli yol bilgisine ihtiyacımız vardır. Mesela "C" sürücüsünün altında "xxx.dat" dosyasının dosya yolu bilgisi yani path bilgisi şöyle ifade edilir : "c:\\xxx.dat" . Burdan yola çıkarak bizim bu yazı çerçevesi içerisinde yapacağımız şey kullanıcıdan aldığımız bir veri yolu bilgisi içindeki dosyaları bulmak ve ekrana yazdırmaktır.

Basit programımızı geliştirmeye başlamadan önce biraz ön bilgi konuyu kavrayabilmemiz için iyi olacaktır. Bildiğiniz gibi bir sıra içindeki dosyaların elde edilmesi sistem programlamada ve uygulamada büyük öneme sahiptir.Örneğin; bir dosyanın dizin ağacında aranması, dosyalara toplu işlemlerin yapılması ya da dizinin sıralı bir şekilde gösterilmesi gibi uygulamalar az sonra öğreneceğimiz basit algoritma ile gerçekleştirilir.

Sıra yapıları ve dosyalama organizasyonu işletim sistemine özgü olduğu için her fakrlı işletim sisteminde dosya bulma işlemini yerine getiren farklı fonksiyonlar vardır. Bu tür işletim sistemine özgü olan fonksiyonlara genel olarak "sistem fonksiyonları" denir. Zaten bizde bu yazımızda Windows işletim sistemine ait sistem fonksiyonlarını kullanacağız.

Şimdi DOS altında dizin içinde dosya arama yapan findfirst ve findnext fonksiyonlarını tanıyalım:

findfirst fonksiyonu

findfirst fonksiyonunun prototip bilgisi başlık dosyası içinde bulunur.Bu fonksiyonun prototipi aşağıdaki gibidir;

int findfirst(const char *dosy_yolu,struct ffblk * ffblk,int attrib)

Örnek:

findfirst("c:\\windows\\sefer.dat" , &ffblk , 0);

İlk parametre dosyaların aranacağı ’path’ bilgisinin saklanacağı karekter dizisidir.İkinci parametre çeşitli dosya bilgilerinin saklandığı 6 elamanlı ve dir.h başlık dosyası içinde tanımlanmış bir yapı nesnesi türünden bir adrestir. struct ffblk türünün yapısı şu şekildedir.

struct ffblk{
char ff_reserved[21];
char ff_attrib;
int ff_ftime;
int ff_fdate;
long ff_fsize;
char ff_name[13];
}


Yapı elemanlarının adından da anlaşılacağı gibi, struct ffblk yapısı dosya adı, tarih, tür ve büyüklük gibi bilgileri tutar.Şimdilik bizim bilmemiz gerekn ff_name ve attrib özelliğidir.ff_name elemanı dosyanın adını, ff_atrib ise dosyanın türünü (arşiv,hidden,directory,system) tutar.

findfirst fonksiyonunun 3. parametresi ise hangi tür doyaların aranacağını gösterir.3. parametre olarak sıfır değeri verdiğimizde findfirst fonksiyonu normal dosyalar dediğimiz "read only ve archive" dosyalarını arar. Bu konu hakkında daha detaylı bilgiyi sonraki makalelerimizde bulabilirsiniz. Biz şimdilik 3 parametre olarak "0" gireceğiz.

findfirst fonksiyonunun geri dönüş değeri ise bize fonksiyonun başarılı olup olmadığı hakkında bilgi verir.Fonksiyon başarılıysa "0", başarısızsa "1" değerine geri döner.

Dosya ismi olarak dosyanın tam adını girebildiğimiz gibi "*" ve "?" gibi joker karekterleri de girebiliriz.Bu durumuda findfirst fonksiyonu bu koşulu sağlayan ilk fonksiyonu bulur.

findnext fonksiyonu

findfirst fonksiyonu ile birden fazla dosya bulunması olası ise ilk bulunan dosya dışındaki dosyalar findnext fonksiyonu ile bulunur. İşletim sistemleri dosyaları diskte kendilerine özgü bir şekilde sıraladıkları için bu organizasyonu bizim bilmemiz zordur.findnext fonksiyonu paremetre olarak bir dosya bilgisi alır ve bu dosya bilgisine bakarak bir sonraki dosyanın bilgisi ile yer değiştirir.(Unutmayın dosya bilgisinde kastımız "struct ffblk" yapısıdır.)

findnext fonksiyonununda prototipi başlık dosyasındadır, ve parametrik yapısı aşağıdaki gibidir.

int findnext(struct ffblk *finfo);

Geri dönüş değeri aynı şekilde fonksiyonun başarılı olup olmadığını gösterir.

Şimdi bu öğrendiğimiz fonksiyonlarla klasik bir dizin listeleme programı yazalım.



#inlude
#include //neden oldugunu biliyoruz değilmi?

int main()

{
struct ffblk dosyamiz; /* bu yapı nesnesi dosya bilgilerimizi saklayacak.*/
int sonuc; /* fonksiyonlarımızın başarılı olup olmadığını kontrol edeceğiz.*/
char dosya_yolu[80]; /*kullanıcıdan alacağımız patyh bilgisini sakalayacağımız dizi.*/
printf("Lütfen bir yol giriniz:");
gets(dosya_yolu); /*kullanıcıdan alkdığımız yolu diziye yerleştirdik.*/

sonuc=findfirst(dosya_yolu,&dosyamiz,0); /* dosya_yolundaki ilk dosyamızı bulduk.
şimdi bir döngü içinde dosya bilgilerini findnext fonksiyonuna gönderip fonksiyon başarısız olana kadar devam edeceğiz.böylece dosya bulma işlemi bitmiş olacak.sonrada istediğimiz formatta dosya ismini ve istediğimiz dosya bilgilerini ekrana yazdırabiliriz.*/


while (!sonuc){ // işlem başarısız olana kadar devam et
printf("%-20s--%-ld\n",dosyamiz.ff_name,dosyamiz.ff_size); /*dosya adını ve büyüklüğünü alt alta yazdık */
sonuc = findnext(&dosyamiz); /*bir sonraki dosyanın bilgilerini istiyoruz ve dosyamiz’in içine saklıyoruz*/
}

}


Ve ilk dosya arayan programımızı yazdık.Bundan sonraki yazılarımızda daha ileri uygulamalarda görüşmek üzere.

Hiç yorum yok:

 
eXTReMe Tracker
Sayfa Bloggoayrılık yazılarıoyunlarkurye web tasarımı broşürlük dizi izle dizi izleKombi Tesisat Radyo DinleChat paysafe paysafe kartSohbet arkadaş travestitravesti travesti travesti