为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2019-11-21 10:01:22
我编写了一个打印目录名或文件名的程序。很简单,但是我遇到了麻烦。它无法区分目录和文件类型。我知道,我用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;}
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

经典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) {

    strcpy(path + directory_length + 1, pDirent->d_name);

    if (stat(path, &vStat) == -1) {

        perror(path);

        continue;

    }

    …

}


查看完整回答
反对 回复 2019-11-21
?
跃然一笑

TA贡献1826条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-11-21
  • 2 回答
  • 0 关注
  • 800 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信