从文件读取时出错

时间:2015-06-02 18:19:44

标签: readdir

这是我的代码。 创建myDir时没有任何权限755。

我可以 opendir 没有任何问题。

readdir 返回 NULL

   if(myvalue){
            Sint32 rtn=0;
            DIR *mydir;
            rtn = mkdir("myDir", _S_IREAD|_S_IWRITE|_S_IEXEC);
            if (rtn == -1) {
                    printf("\n**** Error mkdir : %s \n", strerror(errno));

            } else
                    printf("\n**** Success mkdir : %s \n", strerror(errno));
    errno = 0;

            mydir = opendir("myDir");

            if(mydir)
                    printf("\n**** Success opendir : %s \n", strerror(errno));
            else
                    printf("\n**** Error opendir : %s \n", strerror(errno));
    errno = 0;

            ent = readdir(mydir);

            if (ent == NULL)
                    printf("\n**** Error readdir : %s \n", strerror(errno));
            else
                    printf("\n**** Success readdir : %s \n", strerror(errno));

    }

这里是o / p

**** Success mkdir : No error
**** Success opendir : No error
**** Error readdir : No error

2 个答案:

答案 0 :(得分:1)

此代码假定readdir始终为第一个目录条目返回非NULL,除非出现错误。 POSIX系统也是如此,因为每个目录都包含特殊条目...,但在非POXIX系统上并不一定正确。

作为readdir(3)州的手册页,

  

如果到达目录流的末尾,则返回NULL并且不更改 errno 。如果发生错误,则返回NULL并正确设置 errno

由于您不知道程序中任意点的 errno 的值(某些库函数可能会更改它而不返回错误代码),您将拥有将其设置为一个已知值,在调用readdir之前,如果出现错误,则无法正常设置。由于所有错误号都是正整数,0将是一个不错的选择:

errno = 0;
ent = readdir(mydir);

通过这种方式,您可以辨别出彼此的三种可能结果:

  • ent != NULL:已读取目录条目
  • ent == NULL && errno == 0:无法读取目录条目,但它不是错误,因此它是目录的结尾
  • ent == NULL && errno != 0:发生了错误

答案 1 :(得分:0)

来自手册页

  

如果到达目录流的末尾,则返回NULL并且不更改errno。如果发生错误,则返回NULL并正确设置errno

由于没有后续目录,该函数返回NULL并且errno也为零。