d_type
adalah pengoptimalan kecepatan untuk menghemat lstat(2)
panggilan, jika didukung.
Sebagai readdir
(3) halaman manual menunjukkan, tidak semua sistem file mengembalikan info asli di d_type
bidang (biasanya karena akan membutuhkan pencarian disk tambahan untuk membaca inode, seperti kasus XFS jika Anda tidak menggunakan mkfs.xfs -n ftype=1
(tersirat oleh -m crc=1
yang belum menjadi default). Filesystem yang selalu mengatur DT_UNKNOWN
umum dalam kehidupan nyata, dan bukan sesuatu yang bisa Anda abaikan. XFS bukan satu-satunya contoh.
Anda selalu membutuhkan kode yang akan kembali menggunakan lstat
(2) jika d_type==DT_UNKNOWN
, jika nama file saja tidak cukup untuk memutuskan itu tidak menarik. (Hal ini berlaku untuk beberapa penelepon, seperti find -name
atau memperluas gumpalan seperti *.c
, itulah sebabnya readdir
tidak menimbulkan biaya tambahan untuk mengisinya jika memerlukan pembacaan disk tambahan.)
Linux getdents(2)
halaman manual memiliki program contoh yang melakukan apa yang Anda coba lakukan, termasuk blok operator ternary berantai untuk mendekode d_type
bidang menjadi string teks. (Seperti yang ditunjukkan oleh jawaban lain, kesalahan Anda adalah mencetaknya sebagai karakter, daripada membandingkannya dengan DT_REG
, DT_DIR
, dll.)
Bagaimanapun, jawaban lain sebagian besar mencakup hal-hal, tetapi melewatkan detail penting yang Anda PERLUKAN fallback untuk kasus ketika d_type == DT_UNKNOWN
(0 di Linux. d_type
disimpan dalam apa yang dulunya merupakan padding byte, hingga Linux 2.6.4).
Agar portabel, kode Anda perlu memeriksa struct dirent
itu bahkan MEMILIKI d_type
, jika Anda menggunakannya, atau kode Anda bahkan tidak dapat dikompilasi di luar sistem GNU dan BSD. (lihat readdir(3)
)
Saya menulis contoh untuk menemukan direktori dengan readdir , menggunakan d_type
dengan fallback ke stat
saat d_type tidak tersedia pada waktu kompilasi, saat DT_UNKNOWN, dan untuk symlink.
d_type
di struct kembali memberikan nomor untuk jenis. Anda tidak dapat mencetaknya secara langsung karena nilai yang digunakan tidak dapat dicetak saat ditafsirkan sebagai ASCII (misalnya 4 untuk dir dan 8 untuk file.).
Anda dapat mencetaknya sebagai angka seperti ini:
printf("%d ", dent->d_type)
Atau bandingkan dengan konstanta seperti DT_DIR
dan buat beberapa hasil yang berarti dari itu, seperti tipe char:
if(dent->type == DT_DIR) type = 'd'
Cetak d_type
sebagai bilangan bulat seperti:
printf("%d ", dent->d_type);
dan Anda akan melihat nilai yang bermakna.