d_type是一项速度优化
lstat(2),可在支持时节省通话费用。
正如
readdir(3)手册页所指出的那样,并非所有文件系统都在该
d_type字段中返回真实信息(通常是因为读取索引节点需要花费大量的磁盘查找工作,如果不使用XFS,情况就是这样
mkfs.xfs-n ftype=1(
-mcrc=1即(尚未设置为默认值)。始终设置的文件系统
DT_UNKNOWN在现实生活中很常见,并不是您可以忽略的东西。XFS并不是唯一的例子。
如果仅使用文件名不足以决定它没意思,您将始终需要使用if
lstat(2)的代码
d_type==DT_UNKNOWN。(对于某些调用程序(例如
find-name或扩展glob这样的调用程序),就是这种情况
*.c,这就是为什么
readdir如果需要额外的磁盘读取,也不会产生填充它的开销。)
Linux
getdents(2)手册页上有一个示例程序,可以完成您要执行的操作,其中包括一个链接的三元运算符块,用于将
d_type字段解码为文本字符串。(至于其他的答案指出,你的错误是打印出来作为一个字符,而不是它比较对
DT_REG,
DT_DIR等等)
无论如何,其他答案大多涵盖了所有内容,但是却错过了关键的细节,在这种情况下(Linux上的0 存储在以前的填充字节中,直到Linux 2.6.4),您
需要进行备用 。
d_type == DT_UNKNOWN``d_type
为了便于移植,您的代码需要检查是否有
struct dirent一个
d_type字段(如果使用了它),否则您的代码 甚至不会在GNU和BSD系统之外进行 编译 。(请参阅
readdir(3))



