在Linux中,readdir()函数用于读取目录中的条目。它的原型在<dirent.h>头文件中定义,如下所示:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
readdir()函数接受一个指向DIR结构体的指针作为参数,该结构体表示一个已打开的目录流,并返回一个指向dirent结构体的指针,该结构体包含有关目录中的一个条目的信息。如果到达目录流的末尾,则返回NULL。
dirent结构体通常包含以下字段:
d_ino: 目录项的inode号。d_off: 目录项在目录文件中的偏移量。d_reclen: dirent结构的长度。d_name: 目录项的名称。readdir()函数的返回值及其含义如下:
成功: 返回一个指向dirent结构体的指针,该结构体包含了目录中的一个条目的信息。如果成功读取了目录中的下一个条目,则返回的指针指向该条目的dirent结构体。
到达目录末尾: 如果已经到达目录流的末尾,readdir()函数将返回NULL。这并不意味着出现了错误,只是表示没有更多的目录条目可以读取。
错误: 如果在读取目录时发生错误,readdir()函数也可能返回NULL。在这种情况下,可以通过调用errno变量来确定具体的错误类型。一些可能的错误包括:
EACCES: 权限不足,无法访问目录。EBADF: dirp不是一个有效的目录流指针。EIO: I/O错误发生。ENOTDIR: dirp指向的不是一个目录。ENOMEM: 内存不足。在使用readdir()函数时,通常会在一个循环中调用它,直到返回NULL为止,这样可以遍历目录中的所有条目。下面是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir("."); // 打开当前目录
if (dir == NULL) {
perror("opendir");
exit(EXIT_FAILURE);
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (closedir(dir) == -1) {
perror("closedir");
exit(EXIT_FAILURE);
}
return 0;
}
在这个例子中,程序打开当前目录,然后循环调用readdir()来读取每个条目,直到返回NULL。对于每个条目,它打印出条目的名称。最后,它关闭目录流。如果在任何时候发生错误,程序将打印出一个错误消息并退出。