2013-03-22 44 views
0

如何在调用C中的readdir()时检查ent.d-> name是否为文件或目录,其中ent的类型为struct dirent *。在C中的readdir()中标识目录

+0

我注意到你有一个(因此)帐户。编程问题在那里。如果由于某种原因,您无法在此发布信息,例如由于问题禁止,那么没有理由在此发布编程问题。 – 2013-03-22 13:58:09

回答

2

这就是S_ISREG()S_ISDIR()stat(2)一起使用。详情请见手册页。

如果您的生活环境不完全符合POSIX标准,您可以分别使用DT_REG()DT_DIR()来检查目录性与规则性。这在readdir(3)的手册页中提到。

+0

您可能想使用'lstat',而不是'stat'。 (你是否假设OP在询问Linux?) – 2013-03-22 14:24:06

+0

为什么?该选择取决于您是要识别符号链接还是遵循它们。 – 2013-03-22 14:51:38

+0

@DavidSchwartz另外,手册页提到了两者,并解释了它们之间的区别。无论如何,这个答案本身并不足以写出整个代码(而且这个答案是在问题仍在SuperUser上时写的)。 – 2013-03-22 14:55:38

0

另一种方法是尝试调用执行opendir()在d_name,看是否返回null:

int isDir(struct dirent *ent) 
{ 
    if (ent && strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) // don't include pwd and parent dir 
    { 
     DIR *isDir = opendir(ent->d_name); 
     if (isDir) 
      return 1; 
    } 
    return 0; 
} 
+0

你应该在某个时候关闭DIR ... – DanZimm 2013-03-22 15:16:44

+0

假设POSIX,readdir()已经返回OP所要求的信息,所以opendir()在最好的情况下是多余的,最坏的情况是惩罚。 – 2013-03-22 15:21:26