在 Linux 下,readdir 是用于读取目录内容的函数,常见于 C 语言编程。下面从基本用法、示例代码、注意事项三个方面说明。
readdir 用于读取一个已打开目录中的目录项(文件/子目录)。
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
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]; // 文件名
};
opendir() 打开目录readdir() 循环读取目录项closedir() 关闭目录#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
DIR *dir;
struct dirent *entry;
if (argc < 2) {
printf("Usage: %s <directory>\n", argv[0]);
return 1;
}
dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
gcc readdir_example.c -o readdir_example
./readdir_example /tmp
. 和 ..if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
if (entry->d_type == DT_REG)
printf("普通文件: %s\n", entry->d_name);
else if (entry->d_type == DT_DIR)
printf("目录: %s\n", entry->d_name);
⚠️
d_type在某些文件系统上可能为DT_UNKNOWN
readdir 不是线程安全的readdir_r(已逐步废弃)或 readdir + 加锁readdir 返回的是静态内存指针,不要 freevoid list_dir(const char *path) {
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
// 递归处理
}
}
closedir(dir);
}
如果你是想:
readdir 和 getdents 的区别可以告诉我,我可以进一步说明。