所以我有一个项目需要构建一个可以运行,编辑和读取目录中文件的小型简单文本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文件的其他引用,因为一个文件不在另一个库中,如果是这种情况,我该如何加载该库以便编译代码?
很抱歉很长的帖子,非常感谢所有回答的人!
答案 0 :(得分:6)
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。总结:
-D_FILE_OFFSET_BITS=64
添加到编译器标志中,并使用64位文件偏移进行构建。d_type
是否_DIRENT_HAVE_D_TYPE
。如果是,请使用d_type
。从目录表中获取所需信息(如果可用)将比寻求&读取文件的所有inode。stat
阅读inode并使用st_mode
宏(或类似检查)检查S_ISDIR()
。