【发布时间】:2018-04-29 19:44:48
【问题描述】:
我目前正在尝试在需要区分常规文件和目录的地方进行某种递归查找。 如果给定的文件是一个目录,我做了一个循环来检查 S_ISDIR,但是当应用于 /home 时,我没有得到预期的结果。 我在 /home 中只有一个 pome 目录,所以预期的结果是:
/home/.
/home/..
/home/pome
但它不会将 pome 检测为目录,S_ISDIR() 为 pome 返回 0,为 .和..
代码:
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 不应该返回非零值吗?
【问题讨论】:
-
与您的问题无关,但仅仅因为函数需要一个指针并不意味着您必须动态分配它。在您使用
struct stat和stat函数的情况下,使用struct stat filestat;和stat(filename, &filestat);也可以。 -
你怎么知道
stat()调用有效? -
至于您的问题,您忘记将传递给
opendir的路径与readdir给出的名称连接起来。另外,检查stat返回的内容,我敢打赌它会返回-1并将errno设置为ENOENT。如果你knew how to debug your program,问题应该已经很明显了。