struct dirent在头文件中没有de_type

时间:2016-02-05 02:02:13

标签: c libraries gnu dirent.h

所以我有一个项目需要构建一个可以运行,编辑和读取目录中文件的小型简单文本shell。我有一个小型原型应该可以工作,除了我编译时,我收到一个错误,关于在dirent.h头文件中使用的struct dirent中找不到d_type。

d = opendir( "." );
c = 0;
while ((de = readdir(d))){
    if ((de->de_type) & DT_DIR)
    printf( " ( %d Directory: %s ) \n", c++, de->de_name);
}

变量“de”的类型为struct dirent *并且正在检查它的类型,我得到错误:'struct dirent'没有名为'de_type'的成员

这里我真的很困惑和困惑:我在两个窗口(使用开发C ++)和Ubuntu(使用gcc)上编译了这段代码。我在两个操作系统上都收到了相同的错误,当我检查使用的库时,我认为这是正常的gnu C库,有一个名为d_type的变量:

https://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html

我找到了对dirent.h文件的其他引用,因为一个文件不在另一个库中,如果是这种情况,我该如何加载该库以便编译代码?

很抱歉很长的帖子,非常感谢所有回答的人!

1 个答案:

答案 0 :(得分:6)

来自man readdir(3)

  

POSIX.1强制要求的dirent结构中的唯一字段是:d_name [],未指定大小,在终止空字节之前最多有NAME_MAX个字符;和(作为XSI扩展)d_ino。 其他字段未标准化,并且不存在于所有系统;有关更多详细信息,请参阅下面的注释。

然后继续

  

在POSIX.1-2001中仅指定字段d_name和d_ino。其余字段可用于许多系统,但不是所有系统。在glibc下,程序可以通过测试是否定义了宏_DIRENT_HAVE_D_NAMLEN,_DIRENT_HAVE_D_RECLEN,_DIRENT_HAVE_D_OFF或_DIRENT_HAVE_D_TYPE来检查POSIX.1中未定义的字段的可用性。

     

除了Linux之外,d_type字段主要仅在BSD系统上可用。如果进一步的操作取决于文件的类型,则此字段可以避免调用lstat(2)的费用。如果定义了_BSD_SOURCE特性测试宏,则glibc为d_type中返回的值定义以下宏常量:

所以我建议继续使用stat()来检查条目的类型。 (或lstat()不遵循符号链接。)struct stat包含字段st_mode,可以使用POSIX宏S_ISDIR(m)检查它是否为目录。

附录:请参阅下面的@R ..&评论和this answer。总结:

  1. 使用正确的东西。将-D_FILE_OFFSET_BITS=64添加到编译器标志中,并使用64位文件偏移进行构建。
  2. 检查预处理器宏d_type是否_DIRENT_HAVE_D_TYPE。如果是,请使用d_type。从目录表中获取所需信息(如果可用)将比寻求&读取文件的所有inode。
  3. 作为后退措施(如上所述),使用stat阅读inode并使用st_mode宏(或类似检查)检查S_ISDIR()