【问题标题】:S_ISDIR returning different value for directory [closed]S_ISDIR 为目录返回不同的值[关闭]
【发布时间】: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 statstat 函数的情况下,使用 struct stat filestat;stat(filename, &filestat); 也可以。
  • 你怎么知道stat() 调用有效?
  • 至于您的问题,您忘记将传递给opendir 的路径与readdir 给出的名称连接起来。另外,检查stat 返回的内容,我敢打赌它会返回-1 并将errno 设置为ENOENT。如果你knew how to debug your program,问题应该已经很明显了。

标签: c file directory


【解决方案1】:

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

stat("pome", filestat);

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

因此,对 stat 的调用失败并出现 -1 和 errno ENOENT 并且 IS_DIR-macro 没有意义。对... 的统计调用当然会成功,因为它们存在于所有 目录中(尽管其他信息如inode 编号等不匹配)

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

【讨论】:

  • 谨慎使用chdir() - 如果有必要,可能很难找回。考虑使用fchdir()返回,在使用chdir()移走之前打开目录,以便使用fchdir()返回。如果应用程序在处理单个目录后退出,chdir() 很好。如果您需要处理程序的 10 个参数中的每一个,并且其中一些参数是相对的,而不是绝对的路径名,那么您需要担心回到您开始的位置。但这是对一个好的答案的评论——问题中的问题是stat() 失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多