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

che*_*sam 5 c directory-structure function

我在使用 'if(S_IFDIR(stbuf.st_mode))' 行时遇到一些问题。这是测试要递归到的目录的正确方法吗?目前该函数似乎可以正确执行 1 或 2 个循环,然后失败并出现分段错误。

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

S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 3

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

考虑以下目录层次结构:

 a
 |
 +- b
 |  |
 |  +- c
 ...
Run Code Online (Sandbox Code Playgroud)

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

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