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
等函数。