使用stat()函数测试DIRENT是目录还是文件的正确方法是什么?

时间:2009-10-09 09:21:04

标签: c function directory-structure

我遇到'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);
}

2 个答案:

答案 0 :(得分:3)

是的,这是正确的。但是,既然你永远不会改变目录,你就找不到它。

考虑以下目录层次结构:

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

您的代码将扫描其当前目录,并找到“a”。它将确定它是一个目录,并以递归方式调用自身,并打开“a”进行读取。这有效。该扫描将找到一个名为“b”的目录,但尝试仅使用条目名称打开它将失败,因为该路径现在是“a / b”。

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

答案 1 :(得分: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打印错误的名字,所以你应该在这里添加其他内容。

dirpnt也是如此。当你走出while循环中的getFolderContents时, 你最终在封闭的dirpoint上调用readdir,这会让你离开循环。

但正如bahbar所说: 您无法在全局变量

中递归和存储临时变量