遍历C中的目录

时间:2012-12-13 08:37:31

标签: c unix posix dir

我正在尝试遍历一个路径已经给出的目录,但是下面的程序没有进入目录并被卡在无限循环中。这段代码有什么问题:

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("..");
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您要么缺少某些代码,要么问题是您从未填充/更新states

再看看这一行:

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

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

答案 1 :(得分:0)

在这部分代码中,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),然后注意并修复警告。

答案 2 :(得分:0)

您可以检查该节点是否是没有辅助states的目录。struct dirent有一个名为d_type的字段,而它带有DT_DIR来测试它是否是。目录