C:为什么S_ISDIR不能识别目录?

时间:2013-09-16 18:04:31

标签: c permissions

#include "stdlib.h"
#include "sys/stat.h"
#include "stdio.h"

int main(){
     struct stat s;
     lstat("../", &s);
     if(S_ISDIR(s.st_mode) == 0){
          printf("yes\n");
     }else{
          printf("no\n");
     }
}

结果:“不”

当我运行此代码的不同变体时(例如使用S_ISREG),我得到的结果与我期望的相反。所以对于带有“../”的S_ISREG,我得到“是”。我一直在弄乱这种东西(文件权限,目录创建等),所以我不知道我搞砸了什么或什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您错误地使用了S_ISDIR。如果您有一个目录,那将评估为 true ,您正在测试零,即 false

将其替换为:

 if(S_ISDIR(s.st_mode)){
      printf("yes\n");
 }else{
      printf("no\n");
 }

S_ISREG等其他宏相同。

这些宏的标准参考是POSIX,它在sys/stat.h中说明了这一点:

  

应提供以下宏来测试文件是否为指定类型。提供给宏的值m是stat结构中st_mode的值。 如果测试为真,则宏应评估为非零值;如果测试结果为假,则为0。

     

[...]
  S_ISDIR(m)
  测试目录。
  [...]