这是我的代码。 创建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
答案 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也为零。