1

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

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

3 回答 3

1

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

再看看这一行:

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

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

于 2012-12-13T08:45:26.370 回答
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),然后注意并修复警告。

于 2012-12-13T08:56:01.987 回答
0

您可以检查节点是否是没有辅助的目录statesstruct dirent有一个名为 的字段d_type,并用它DT_DIR来测试它是否是一个目录。

于 2012-12-13T09:35:35.577 回答