|
Bir dizin içindeki dosyaların bulunması - I |
|
Gönderiliyor lütfen bekleyin... |
|
|
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 göreceli yol bilgisine ihtiyacımız vardır. Mesela "C"
sürücüsünün altında "sefer.dat" dosyasının dosya yolu bilgisi yani
path bilgisi şöyle ifade edilir : "c:\\sefer.dat" . Burdan yola çıkarak
bizim bu yazı çerçevesi içerisinde yapacağımız şey kullanıcıdan aldığımız bir
path 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 dizin içindeki dosyaların elde edilmesi sistem programlamada
ve uygulamada çok 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.
Dizin yapıları
ve dosyalama organizasyonu işletim sistemine özgü olduğu için her işletim sisteminde
dosya bulma işlemini yerine getiren özel 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.
Dizin içinde dosya
arayan fonksiyonlar her işletim sisteminde genellikle bulunur.Bu fonksiyonlkar
DOS işletim sisteminde findfirst,findnext ; Win32de findfirstfile,findnextfile;
UNIX/LINUX türevi işletim sistemlerinde ise opendir,readdir ve closedir
dır.
Şimdi DOS altında
dizin içinde dosya arama yapan findfirst ve findnext fonksiyonlarını tanıyalım:
findfirst
fonksiyonu
findfirst fonksiyonunun
prototip bilgisi <dir.h> 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 <dir.h> 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
<stdio.h>
#include <dir.h> //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
dosyamizin 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.
Bu yazı ile ilgili her türlü sorununuzu bana iletebilirsiniz.
Makale:
Bir dizin içindeki dosyaların bulunması - I C ve Sistem Programlama Sefer Algan
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|