S_ISDIR为目录

时间:2017-11-16 10:07:51

标签: c file directory

我目前正在尝试进行某种递归查找,我需要将常规文件与目录区分开来。 我做了一个循环来检查S_ISDIR,如果给定的文件是一个目录但是当应用于/ home时,我没有得到预期的结果。 我在/ home中只有一个pome目录,所以预期的结果是:

/home/.
/home/..
/home/pome

但它没有将pome检测为目录,S_ISDIR()为pome返回0,为1返回1。和..

代码:

DIR * dir = opendir("/home");
if(dir==NULL){
    puts("Unknown directory");
    return 1;
}
char path[SIZE_PATH];
memset(path,'\0',sizeof(path));
strcpy(path,"/home");
struct dirent * trucdir;
char filename[SIZE_PATH];
memset(filename,'\0',sizeof(filename));
struct stat * filestat=malloc(sizeof(struct stat));
while((trucdir=readdir(dir))!=NULL){
    memset(filename,'\0',sizeof(filename));
    strcpy(filename,trucdir->d_name);
    stat(filename,filestat);
    if(S_ISDIR(filestat->st_mode)!=0){
        puts(filename);
    }
}

如果文件是目录,是不是S_ISDIR应该返回非零值?

1 个答案:

答案 0 :(得分:2)

您必须通过检查其返回值来检查您的stat() - 实际成功。在您的情况下,对stat的调用是:

stat("pome", filestat);

但您当前的工作目录(cwd)不是/ home

因此,对stat的调用失败,-1和errno ENOENTIS_DIR - 宏无意义。对...的统计调用当然成功,因为它们存在于所有目录中(尽管其他信息如inode编号等不匹配然后)

您必须确保在filename中提供完整路径(即/home/pome),或者将cwd设置为/ home之前(使用{{1 }});这应该可以解决你的问题!