我想检查文件是目录,链接还是仅仅是常规文件。我遍历目录并将每个文件保存为struct dirent *
。我尝试将d_ino
传递给S_ISDIR(m)
,S_ISLINK(m)
或S_ISREG(m)
,无论文件是什么,我都不会得到肯定的结果。所以我的问题是:如何将S_ISDIR(m)
与struct dirent
一起使用?
答案 0 :(得分:7)
使用readdir(3)
读取目录时,文件类型存储在您收到的每个d_type
的{{1}}成员变量中,而不是struct dirent
成员中。你很少会关心inode编号。
但是,并非所有实现都具有d_ino
成员的有效数据,因此您可能需要在每个文件上调用stat(3)
或lstat(3)
以确定其文件类型(使用{{ 1}}如果您对符号链接感兴趣,或者如果您对符号链接的目标感兴趣则使用d_type
,然后使用lstat
宏检查stat
成员。
典型的目录迭代可能如下所示:
st_mode
答案 1 :(得分:0)
S_ISDIR(m),S_ISLINK(m)将用于struct stat.st_mode
,而不是struct dirent
。例如:
struct stat sb;
...
stat ("/", &sb);
printf ("%d", S_ISDIR (sb.st_mode));
答案 2 :(得分:0)
不幸的是,如上所述,您不能将S_IS *宏与struct dirent成员一起使用。但是您不需要,因为成员d_type已经为您提供了该信息。你可以直接测试它:
struct dirent someDirEnt;
... //stuff get it filled out
if(someDirEnt.d_type==DT_LNK)
...//whatever you link
特别是d_type成员可能包含:
DT_BLK This is a block device. DT_CHR This is a character device. DT_DIR This is a directory. DT_FIFO This is a named pipe (FIFO). DT_LNK This is a symbolic link. DT_REG This is a regular file. DT_SOCK This is a UNIX domain socket. DT_UNKNOWN The file type is unknown.