在 CentOS(Linux) 里,readdir 是 C 语言 POSIX 接口,用来读取目录内容。下面从用法、示例、常见问题三个方面说明。
readdir 定义在 <dirent.h> 中,配合 opendir / closedir 使用。
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
struct dirent {
ino_t d_ino; // inode
off_t d_off;
unsigned short d_reclen;
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};
#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
DIR *dir;
struct dirent *entry;
if (argc < 2) {
printf("Usage: %s <dir>\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_test.c -o readdir_test
./readdir_test /etc
. 和 ..readdir 会返回:
.(当前目录)..(上级目录)通常要过滤:
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
if (entry->d_type == DT_DIR)
printf("[DIR] %s\n", entry->d_name);
else if (entry->d_type == DT_REG)
printf("[FILE] %s\n", entry->d_name);
⚠️ 某些文件系统(如部分 NFS)
d_type可能为DT_UNKNOWN
readdir 不是线程安全readdir_r(dir, entry, &result);
readdir 只读取一层,递归需自己写:
if (entry->d_type == DT_DIR) {
// 拼接路径
// 再次 opendir + readdir
}
readdir#include <dirent.h>如果你是想:
可以告诉我你的具体场景。