Dizin Akımlarının Okunması ve Kapatılması
Önceki Dizinlere Erişim Sonraki
Dizin Akımlarının Okunması ve Kapatılması
Bu bölümde bir dizin akımından girdilerin nasıl okunacağı ve akımla işiniz bittiğinde onu nasıl kapatacağınız anlatılacaktır. Bu bölümdeki tüm semboller dirent.h başlık dosyasında bildirilmiştir.
struct dirent *readdir
(DIR *dizinakımı)
işlev
Bu işlev dizindeki sonraki girdiyi okur. Normalde dosya hakkında bilgi içeren bir yapıya gösterici ile döner. Bu yapı durağan olarak ayrıldığından işlevin sonraki çağrıları üzerine yazabilir.
Taşınabilirlik Bilgisi
Bazı sistemlerde readdir işlevi . ve .. için, bunlar her dizinde daima geçerli dosya isimleri oldukları halde, girdi döndürmez. Bkz. Dosya İsmi Çözümlemesi.
Eğer dizinde başka girdi kalmamışsa ya da bir hata saptanmışsa işlev bir boş gösterici ile döner. Aşağıdaki errno hata durumu bu işlev için tanımlanmıştır:
EBADF
dizinakımı argümanı geçersiz.
readdir işlevi evresel değildir. Çok evreli yazılımlarda aynı dizinakımı ile readdir kullanımı dönüş değerinin üzerine yazar. Bu durum sorun oluyorsa bu işlev yerine readdir_r işlevini kullanın.
int readdir_r
(DIR            *dizinakımı,
 struct dirent  *girdi,
 struct dirent **sonuç)
işlev
Bu işlev readdir işlevinin evresel sürümüdür. readdir işlevi gibi dizindeki sonraki girdiyi okur. Fakat sonuç durağan ayrılmış bellekte saklanmadığından aynı anda çalışan evreler arasında bir soruna yol açmaz. Sonuç girdi ile gösterilen nesne içinde döner.
Normalde, readdir_r işlevi sıfırla döner ve girdi *sonuç'a atanır. Okunacak başka girdi kalmamışsa ya da bir hata saptanmışsa readdir_r *sonuç'a bir boş gösterici atar ve sıfırdan farklı bir hata kodu ile döner. Ayrıca bu hata kodunu errno değişkenine atar. Bu işlev için tanımlanmış hata kodları readdir ile aynıdır.
Taşınabilirlik Bilgisi
Bazı sistemlerde struct dirent yapısının d_reclen diye bir üyesi olmasa ve dosya isminin izin verilen en büyük boyutta olabilmesine izin verilse bile readdir_r dosya ismi için boş karakter sonlandırmalı dizge döndürmeyebilir. Günümüzdeki sistemlerin tamamı d_reclen alanına sahiptir ve eski sistemlerde çok evrelilik pek sorun oluşturmaz. Her durumda readdir ile ilgili böyle bir sorun yoktur, yani d_reclen üyesine sahip olmayan sistemlerde bile harici kilitleme ile çok evrelilik mümkün olur.
Ayrıca, struct dirent türünün tanımlanması da önem kazanır. readdir_r işlevinin ikinci parametresinde bu türde bir nesneye basitçe gösterici atanması yeterli olmayabilir. Bazı sistemler d_name elemanını yeterli uzunlukta tanımlamazlar. Bu durumda kullanıcının ek alan sağlaması gerekir. d_name dizisinde en azından NAME_MAX + 1 karakterlik alan bulunmalıdır. readdir_r çağrısı şöyle yapılabilir:
  union
  {
    struct dirent d;
    char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
  } u;

  if (readdir_r (dir, &u.d, &res) == 0)
    …
32 bitlik makineler üzerinde büyük dosyasistemlerini desteklemek için son iki işlevin LFS sürümleri de vardır.
struct dirent64 *readdir64
(DIR *dizinakımı)
işlev
readdir64 işlevi struct dirent64 türünde bir gösterici döndürmesi dışında readdir işlevi gibidir. Bu veri türünün bazı üyeleri (özellikle d_ino üyesi) büyük dosyasistemlerini desteklemek üzere farklı boyutta olabilir.
Diğer bakımlardan bu işlev readdir işleviyle eşdeğerdedir.
int readdir64_r
(DIR              *dizinakımı,
 struct dirent64  *girdi,
 struct dirent64 **sonuç)
işlev
readdir64_r işlevi 2. ve 3. parametrelerini struct dirent64 türünde alması dışında readdir_r işlevi gibidir. readdir_r işlevinin açıklamalarında dikkat çekilen hususlar bu işlev için de geçerlidir.
int closedir
(DIR *dizinakımı)
işlev
Bu işlev dizinakımı ile belirtilen dizin akımını kapatır. Başarılıysa 0, değilse -1 döndürür.
Aşağıdaki errno hata durumu bu işlev için tanımlanmıştır:
EBADF
dizinakımı argümanı geçersiz.
Önceki Üst Ana Başlık Sonraki
Bir Dizin Akımının Açılması Başlangıç Bir Dizinin İçeriğini Listeleyen Bir Örnek
Bir Linux Kitaplığı Sayfası