4

我在使用“if(S_IFDIR(stbuf.st_mode))”行时遇到了一些问题。这是测试要递归到的目录的正确方法吗?目前的功能似乎对 1 或 2 个循环正确,然后失败和分段错误。

我已经尝试了以下方法,并且可能更多作为条件。

S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)

我已经包含了整个功能,因为我担心问题可能出在其他地方。

void getFolderContents(char *source, int temp){
    struct stat stbuf;
    int isDir;
    dirPnt = opendir(source);
    if(dirPnt != NULL){
        while(entry = readdir(dirPnt)){
            char *c = entry->d_name;
            if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){
            }
            else{
                stat(entry->d_name, &stbuf);
                printf("%i %i ", S_IFMT, stbuf.st_mode);
                if(S_IFDIR(stbuf.st_mode)){            //Test DIR or file
                printf("DIR: %s\n", entry->d_name);
                getFolderContents(entry->d_name, 0);
            }
            printf("FILE: %s\n", entry->d_name);
        }
    }
    closedir(dirPnt);
}
4

2 回答 2

3

对,那是正确的。但是由于您从未更改过该目录,因此您将找不到它。

考虑以下目录层次结构:

 a
 |
 +- b
 |  |
 |  +- c
 ...

您的代码将扫描其当前目录,并找到“a”。它会判断它是一个目录,并递归调用自己,并打开“a”进行读取。这行得通。该扫描将找到一个名为“b”的目录,但尝试仅使用条目名称打开它会失败,因为路径现在是“a/b”。

chdir()我建议在打开目录之前更改目录(使用)。这意味着你可以opendir(".")。存储旧路径,并chdir()在递归该级别完成时再次退出(而不是在进行递归调用以更深入之前)。

于 2009-10-09T09:26:09.113 回答
1

条目在哪里定义?它是局部变量吗?我不明白为什么它会出现段错误,但可能你应该将它设为局部变量。它会咬你的一个例子是:

                    if(S_IFDIR(stbuf.st_mode)){            //Test DIR or file
                            printf("DIR: %s\n", entry->d_name);
                            getFolderContents(entry->d_name, 0);
                    }
                    printf("FILE: %s\n", entry->d_name);

printf 将打印错误的名称,因此您可能应该在此处添加一个 else。

dirpnt 也是如此。当您在 while 循环中退出 getFolderContents 时,您最终会在关闭的 dirpoint 上调用 readdir,这应该会让您退出循环。

但正如 bahbar 所述:您不能递归并将临时变量存储在全局变量中

于 2009-10-09T09:26:23.350 回答