Dizinlerle çalışan işlevlerin daha yüksek seviyedeki bir arayüzü de scandir işlevidir. Onun yardımıyla, bir dizin içindeki girdilerin bir kısmı seçilebilir, sıralanabilir ve bir isim listesi alınabilir.
int scandir | (const char *dizin,
struct dirent ***isimlistesi,
int (*seçici) (const struct dirent *),
int (*sıralayıcı) (const void *, const void *)) |
işlev
scandir işlevi dizin ile belirtilen dizinin içeriğini tarar. Sonucu döndüren *isimlistesi seçilen dizin girdilerini içeren struct dirent türündeki göstericilerin dizisidir ve malloc kullanılarak ayrılır. Dizindeki tüm girdilerin değilde sadece seçilen girdilerin döndürülmesi için işlev kullanıcı tarafından sağlanan seçici işlevi çağırır. Sadece seçici işlevin sıfırdan farklı bir değer döndürdüğü girdiler seçilir.
Son olarak, *isimlistesi içindeki girdiler kullanıcı tarafından sağlanan sıralayıcı işlevi çağrılarak sıraya sokulur. sıralayıcı işlevine aktarılan argümanlar struct dirent ** türündedir, bu bakımdan strcmp veya strcoll işlevleri doğrudan kullanılamaz. Kullanılabilecek işlevler için aşağıya alphasort ve versionsort işlevlerine bakınız.
İşlevin normal dönüş değeri *isimlistesi'ne yerleştirilen girdilerin sayısıdır. -1 dönmüşse bir hata saptanmış demektir (ya dizin okumak için açılamamıştır ya da malloc başarısız olmuştur). Bu durumda errno değişkenine hata durumu atanır.
Yukarıda açıklanan scandir işlevinin dördüncü argümanı bir sıralama işlevine bir göstericidir. Yazılımcıya kolaylık olarak GNU C kütüphanesi bu amaca uygun olarak gerçeklenmiş işlevler içerir.
int alphasort | (const void *a,
const void *b) |
işlev
alphasort işlevi
strcoll işlevi gibi davranır (bkz.
Dizi/Dizge Karşılaştırması). Aradaki fark, argümanların dizge göstericisi değil
struct dirent ** türünde olmasıdır.
alphasort işlevinin dönüş değeri a ve b girdilerinin karşılaştırılmasına bağlı olarak sıfırdan küçük bir değer, sıfır ya da sıfırdan büyük bir değer olur.
int versionsort | (const void *a,
const void *b) |
işlev
versionsort işlevi dahili olarak strverscmp işlevini kullanması dışında alphasort işlevi gibidir.
Eğer dosya sistemi büyük dosyaları destekliyorsa, dirent yapısının tüm bilgiyi içermesi mümkün olmadığından scandir işlevi kullanılamaz. LFS sistemi için yeni bir tür, struct dirent64, bunu kullanmak için de yeni bir işlev vardır.
int scandir64 | (const char *dizin,
struct dirent64 ***isimlistesi,
int (*seçici) (const struct dirent64 *),
int (*sıralayıcı) (const void *, const void *)) |
işlev
scandir64 işlevi dizin girdilerini struct dirent64 türünde döndürmesi dışında scandir işlevi gibidir. seçici ile gösterilen işlev yine, istenen girdileri seçmek için kullanılır, ama işlev bu sefer struct dirent64 * türünde bir parametre alır.
Benzer şekilde, sıralayıcı işlevi de struct dirent64 ** türünde iki parametre alır.
sıralayıcı bu sefer farklı türde argümanlar aldığından ve alphasort ve versionsort işlevleri bu türde argüman almadıklarından burada kullanılamazlar. Bu bakımdan iki işlev daha tanımlanmıştır.
int alphasort64 | (const void *a,
const void *b) |
işlev
alphasort64 işlevi
strcoll işlevi gibi davranır (bkz.
Dizi/Dizge Karşılaştırması). Aradaki fark, argümanların dizge göstericisi değil
struct dirent64 ** türünde olmasıdır.
alphasort64 işlevinin dönüş değeri a ve b girdilerinin karşılaştırılmasına bağlı olarak sıfırdan küçük bir değer, sıfır ya da sıfırdan büyük bir değer olur.
int versionsort64 | (const void *a,
const void *b) |
işlev
versionsort64 işlevi dahili olarak strverscmp işlevini kullanması dışında alphasort64 işlevi gibidir.
scandir kullanırken 64 bitlik karşılaştıma işlevlerini kullanmamak (ya da tam tersi) önemlidir. Bunun çalıştığı sistemler varsa da diğerleri ümitsizce başarısız olacaktır.