C 编程 - Stat 系统调用 - 错误

标签 c linux system-calls stat

我是 C 的新手,但正在尝试一些系统调用。

我正在编写程序,循环访问目录中的所有文件并打印当前文件名和大小。我可以让程序打印文件名,但是当我执行 stat 系统调用时它出错了。

部分代码如下:

while (dptr = readdir(dirp)) { 
            if (stat(dptr->d_name, &buf) != 0) {
                //Always does this and it does print the file name
                printf("Error on when getting size of %s \n", dptr->d_name);
            } else {
                //Never gets here
                printf("%u", buf.st_size);
              }         
}

我有这样描述的结构:

struct stat buf;
struct dirent *dptr;
DIR *dirp;

如果我改变:

if (stat(dptr->d_name, &buf) != 0)

if (stat(dptr->d_name, &buf) != [EACCES])

它仍然进入循环,这让我觉得它无法读取文件名,但它在错误语句中打印它没有问题。

有人能指出我正确的方向吗?谢谢!

爱丽丝

最佳答案

首先,如果遇到错误,stat() 返回 -1,而不是实际的错误代码。错误代码将在 errno 中设置。打印错误的一种简单方法是使用 perror()。

其次,dptr->d_name 只提供文件的相对文件名,而不是完整的文件名。要获得完整的文件名,您必须从相对文件名和目录名生成它。

这是一个例子:

int cwdloop(void)
{
   DIR           * dirp;
   struct stat     buff;
   struct dirent * dptr;
   char            filename[1024];
   char            dirname[1024];

   if (!(getcwd(dirname, 1024)))
   {
       perror("getcwd");
       return(1);
   };

   dirp = opendir(dirname);
   if (!(dirp))
   {
      perror("opendir()");
      return(1);
   };

   while ((dptr = readdir(dirp)))
   {
      snprintf(filename, 1024, "%s/%s", dirname, dptr->d_name);
      if (stat(filename, &buff) != 0)
      {
         perror("stat()");
         return(1);
      } else {
         printf("size: %u\n", (unsigned)buff.st_size);
      };
   };

   closedir(dirp);

   return(0);
}

关于C 编程 - Stat 系统调用 - 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524876/

相关文章:

c - 将结构传递给 xv6 系统调用

C:父子进程

linux - 如何并发运行子进程

go - os : process already finished when sending syscall. SIGCONT(可能是错误?)

C: 用 scanf fork

linux -/usr/bin/包含 & 符号的 bash 脚本的时间

c - 如何在 Linux 2.6.29 中解码 ioctl() 系统调用中的 arg 指针?

c - C 或 java 中的 WAP : Consider two char arrays, "abcdefg"和 "xyz"...输出必须打印 "axbyczdefg"

C#define 语句、枚举、结构

c - 未指定的启动失败 - CUDA 中的并行扫描