我目前正在尝试进行某种递归查找,我需要将常规文件与目录区分开来。 我做了一个循环来检查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应该返回非零值?
答案 0 :(得分:2)
您必须通过检查其返回值来检查您的stat()
- 实际成功。在您的情况下,对stat的调用是:
stat("pome", filestat);
但您当前的工作目录(cwd)不是/ home !
因此,对stat的调用失败,-1
和errno ENOENT
和IS_DIR
- 宏无意义。对.
和..
的统计调用当然成功,因为它们存在于所有目录中(尽管其他信息如inode编号等不匹配然后)
您必须确保在filename
中提供完整路径(即/home/pome
),或者将cwd设置为/ home之前(使用{{1 }});这应该可以解决你的问题!