c - S_ISDIR() 的问题导致 C(可能是因为 stat() 没有正确设置其结构?)

标签 c stat

我希望我的程序获取一个目录,然后打印该目录的内容并说明每个项目是否是一个目录。如果我给它一个包含文件 F1.txt 和 F2.txt 以及文件夹 D1、D2 和 D3 的目录,它应该打印:

F1.txt不是目录
F2.txt不是目录
D1是目录
D2是目录
D3是目录

char* curr[100];
DIR* dirp = opendir(name);
struct dirent* x;
struct stat fstat;

//go to each file til readdir gives NULL
while((x = readdir(dirp)) != NULL) {

  //store name of file
  curr[0] = (x -> d_name);

  //ignore files starting with "."
  if(*curr[0] == '.')
    continue;

  //set status
  stat(curr[0], &fstat);

  //print file name
  printf("%s", *curr);

  //check if it's a directory and print result
  if(S_ISDIR(fstat.st_mode))
    printf(" is directory\n");
  else
    printf(" is not directory\n");
}

这会打印出所有文件都不是目录。如果我删除忽略以“.”开头的文件的部分,它会说 F1.txt、F2.txt 和 D1 不是目录,而 .、D2、D3 和 .. 是目录(按此顺序)。这让我认为问题在于 stat 调用,而不是我对宏的使用,但我在这里很困惑,所以我不知道。

最佳答案

您正在传递 stat 文件名,但它需要文件的路径。如果您检查 stat 的返回值,您会发现只有 ... 才成功,因为它们存在于任何目录中.

规范的答案:永远不要试图理解程序在发生错误情况时的行为。一旦有一点点神秘(最晚),就添加代码来检查所有函数的返回值。

关于c - S_ISDIR() 的问题导致 C(可能是因为 stat() 没有正确设置其结构?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505846/

相关文章:

c - 包含路径的预处理器串联

r - conf.int 在 3.3 中不再使用 ggplot2、stat_summary

C++ - stat() 需要什么权限?

c - 在 C 中修改文件的文件统计信息

c - 为什么在克隆系统调用后重新分配死锁?

C 行尾字符

c - golang os *File.Readdir 在所有文件上使用 lstat。可以优化吗?

c - 使用 stat 查找文件长度时的错误检查

c - K&R 练习 1.16 - 线长限制

嵌套列表的 C 等价物 (Python)