【问题标题】:Traversing through Directories in C遍历C中的目录
【发布时间】:2012-12-13 08:37:31
【问题描述】:

我正在尝试遍历一个目录,该目录的路径已给出,但以下程序未进入该目录并陷入无限循环。这段代码有什么问题:

void func(char path[]);
int main(int argc, char *argv)
{
    char buf[255];
    getcwd(buf,255);
    func(buf);
}

void func(char path[])
{
    DIR *dirp;
    struct stat states;
    struct dirent *direntp;

    dirp=opendir(path);
    chdir(path);

    while((direntp=readdir(dirp))!=NULL)
    {
        if(S_ISDIR(states.st_mode))//true than returns zero
        {
            printf("%s\n",direntp->d_name);
        }
    else
        if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,"..")))// if true retrns zero
        {   
            continue;
        }
        else
        {
            func(direntp->d_name);
            chdir("..");
        }
    }
}

【问题讨论】:

    标签: c unix posix dir


    【解决方案1】:

    您要么遗漏了一些代码,要么问题在于您从未填充/更新states

    再看看这一行:

    if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,"..")))
    

    它永远不会评估为真值,因为这要求direntp->d_name 同时等于...(这根本不可能)。我猜你想在这里检查&&,它只会在你的目录名称与任一值匹配的情况下进入分支。

    【讨论】:

    • 抱歉打错了!用于整体比较
    • 不确定我能否关注你。你否定逻辑或的结果 - 这就是我的阅读方式?
    • @Alfred 来自德摩根定律!(a || b) == !a && !b。在您的情况下,只有当 strcmp() 都返回 0 这是不可能的(字符串必须同时等于 ".""..")时才会成立。
    • 马里奥是对的。您应该进行如下调用来更新状态状态: if(stat(currentPath, &states) == -1){ perror("stat");返回错误号; }
    【解决方案2】:

    你可以检查节点是否是没有辅助states的目录。struct dirent有一个名为d_type的字段,并与DT_DIR一起测试它是否是一个目录。

    【讨论】:

      【解决方案3】:

      在您的这段代码中,states 在使用之前没有被初始化:

      struct stat states;
      struct dirent *direntp;
      
      dirp=opendir(path);
      chdir(path);
      
      while((direntp=readdir(dirp))!=NULL)
      {
          if(S_ISDIR(states.st_mode))//true than returns zero
      

      我认为编译器也会对此发出警告,因此请在编译器中打开警告(-W -Wall 用于 gcc),然后注意并修复警告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        • 2015-11-19
        • 2016-07-24
        相关资源
        最近更新 更多