0
DIR *dir_ptr;
struct dirent *dir_entery;
dir_ptr = opendir("/tmp");

while (dir_ptr&&(dir_entery = readdir(dir_ptr))) {
   printf("%s \n", dir_entery->d_name);
}

printf("%s \n", strerror(errno));

给出这个输出:

file_name
dir_name
errno = Remote I/O error

在我有一个目录和两个文件时,在执行它退出 while/tmp后到达 readdir并输入此错误:opendir(dir)

errno = Remote I/O error

为什么在目录中的dir之后无法读取文件/tmp

4

1 回答 1

1

readdir()没有记录到 return REREMOTEIO,因此很可能会sterror()提供误导性信息。

设置errno0 进入while()循环之前,即调用之前readdir()

来自man readdir

如果到达目录流的末尾,则返回 NULL 并且 不更改errno 。如果发生错误,则返回 NULL 并适当设置 errno 。要区分流的结束和错误,请在调用readdir()之前将errno 设置为零,然后如果返回 NULL ,则检查errno的值。

要在返回时测试这两种情况,您可能希望像这样修改代码:readdir()NULL

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

  ...

  DIR * dir_ptr = opendir("/tmp");
  if (NULL != dir_ptr)
  {
    perror("opendir() failed");
  }
  else
  {
    struct dirent * dir_entery;

    errno = 0; 
    while ((dir_entery = readdir(dir_ptr))) /* an extra pair of parenthesis here to silence GCC */
    {
      printf("%s\n", dir_entery->d_name);
    }

    if (0 != errno)
    {
      perror("readdir() failed");
    }
    else
    {
      printf("No more entries.\n");
    }
  }

  ...
于 2013-05-30T16:50:34.930 回答