readdir 是 Linux/UNIX 系统中用于读取目录内容的函数,属于 POSIX 标准的一部分。下面我将详细介绍它的使用方法。
readdir 函数用于读取目录中的条目(文件和子目录),它通常与 opendir 和 closedir 配合使用。
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
opendir() 打开目录readdir() 循环读取目录内容closedir() 关闭目录#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main(int argc, char *argv[]) {
DIR *dir;
struct dirent *entry;
if (argc != 2) {
fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
return 1;
}
dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir failed");
return 1;
}
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0) {
perror("readdir failed");
closedir(dir);
return 1;
}
closedir(dir);
return 0;
}
readdir 返回的 struct dirent 包含以下重要成员:
struct dirent {
ino_t d_ino; /* 文件inode号 */
off_t d_off; /* 到下一条目的偏移 */
unsigned short d_reclen; /* 记录长度 */
unsigned char d_type; /* 文件类型 */
char d_name[256]; /* 文件名 */
};
可以使用 d_type 成员来判断文件类型:
switch (entry->d_type) {
case DT_REG:
printf("常规文件: %s\n", entry->d_name);
break;
case DT_DIR:
printf("目录: %s\n", entry->d_name);
break;
case DT_LNK:
printf("符号链接: %s\n", entry->d_name);
break;
// 其他类型...
}
readdir 不是线程安全的,多线程环境下应考虑使用 readdir_r(但注意,在较新的 glibc 中 readdir_r 已被弃用)readdir 返回的条目顺序是不确定的readdir 都会返回下一个目录条目,直到返回 NULL 表示结束errno 以确定是否出错readdir 常用于:
- 实现 ls 命令类似功能
- 递归遍历目录树
- 查找特定文件
- 统计目录内容
希望这个指南能帮助你理解和使用 readdir 函数。如需更高级的目录操作,还可以考虑 scandir、ftw 等函数。