猿问

为什么stat使用readdir中的名称失败?

我编写了一个打印目录名或文件名的程序。很简单,但是我遇到了麻烦。它无法区分目录和文件类型。我知道,我用stat.st_mode完成了。但是出了点问题:

当我使用gdb检查st_mode值时,我发现它是0,但“。”除外。和“ ..”,所以这里是一个问题:为什么st_mode为0?


那就是我的代码:


#include <stdio.h>

#include <stdlib.h>

#include <dirent.h>

#include <sys/stat.h>


int main(void)

{

    DIR *pDir = opendir("MyDirectory");

    struct dirent *pDirent;

    struct stat vStat;


    if (pDir == NULL)

    {

        printf("Can't open the directory \"MyDirectory\"");

        exit(1);

    }


    while ((pDirent = readdir(pDir)) != NULL)

    {

        stat(pDirent->d_name, &vStat);

        if (S_ISDIR(vStat.st_mode))

            printf("Directory: %s\n", pDirent->d_name);

        else

            printf("File: %s\n", pDirent->d_name);

    }


    closedir(pDir);

    return 0;

}


叮当猫咪
浏览 801回答 2
2回答

慕后森

经典readdir错误:pDirent->d_name是目录条目的名称,而不是文件的路径。这"1","4-5.c"等于是你的stat电话正在寻找该名称的文件在当前目录中,而不是下MyDirectory。检查的返回值stat。您会看到它是ENOENT- .和和..,除了在当前目录中也存在。当stat出现故障时,stat结构的内容是不确定的。如果您opendir在以外的目录中进行调用,.则要对返回的名称执行几乎所有有用的操作,您需要构建完整路径。将传递到的路径复制opendir到缓冲区中,该缓冲区要有足够的空间以容纳斜杠和文件名,然后将每个文件名复制到该缓冲区。概念验证代码(省略错误检查等):char *directory = "MyDirectory";size_t directory_length = strlen(directory);char *path = malloc(directory_length + 1 + NAME_MAX);strcpy(path, directory);path[directory_length] = '/';while ((pDirent = readdir(pDir)) != NULL) {&nbsp; &nbsp; strcpy(path + directory_length + 1, pDirent->d_name);&nbsp; &nbsp; if (stat(path, &vStat) == -1) {&nbsp; &nbsp; &nbsp; &nbsp; perror(path);&nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; }&nbsp; &nbsp; …}

跃然一笑

请注意,使用该方法是chdir()有效的,但是如果您需要在一个命令中处理多个目录,可能会给您带来麻烦。您如何回到起点?(一个答案是fchdir()&nbsp;-其他答案要复杂得多。
随时随地看视频慕课网APP
我要回答