GNU/Linux >> Belajar Linux >  >> Linux

Memeriksa apakah dir. entri yang dikembalikan oleh readdir adalah direktori, tautan, atau file. dent->d_type tidak menunjukkan jenisnya

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.


Linux
  1. Cara Menemukan File Terlama Di Pohon Direktori Di Linux

  2. Saat Anda Mengetik "ls -a", Apa Arti "." Dan ".."?

  3. Bagaimana Menemukan Jenis File Img Dan Memasangnya?

  1. Memahami Direktori /etc/sysconfig

  2. cara menemukan pemilik file atau direktori dengan python

  3. Node.js:Periksa apakah file adalah tautan simbolis saat mengulang direktori dengan 'fs'

  1. mkdir -p gagal saat direktori ada

  2. Bagaimana cara mendapatkan direktori absolut dari sebuah file di bash?

  3. bash:./helloworld_s:tidak ada file atau direktori seperti itu. Filenya jelas ada