带有struct dirent的sys / stat S_ISDIR(m)

时间:2012-04-29 21:17:22

标签: c++ c systems-programming

我想检查文件是目录,链接还是仅仅是常规文件。我遍历目录并将每个文件保存为struct dirent *。我尝试将d_ino传递给S_ISDIR(m)S_ISLINK(m)S_ISREG(m),无论文件是什么,我都不会得到肯定的结果。所以我的问题是:如何将S_ISDIR(m)struct dirent一起使用?

3 个答案:

答案 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.