在 CentOS(Linux) 下,readdir 通常指 C 语言调用 readdir() 读取目录内容。
“过滤”一般有两种理解,我都给你说明一下,并附常用示例。
readdir() 进行过滤(C 语言)readdir() 本身 不能过滤,只能在循环里判断。
. 和 ..#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
if (!dir) return 1;
while ((entry = readdir(dir)) != NULL) {
// 过滤 . 和 ..
if (entry->d_name[0] == '.')
continue;
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) { // 普通文件
printf("%s\n", entry->d_name);
}
}
closedir(dir);
return 0;
}
⚠️
d_type在某些文件系统(如 NFS)上可能不可用,稳妥做法是用lstat()。
lstat() 精确过滤(推荐)#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
struct stat st;
while ((entry = readdir(dir)) != NULL) {
lstat(entry->d_name, &st);
if (S_ISREG(st.st_mode)) {
printf("FILE: %s\n", entry->d_name);
} else if (S_ISDIR(st.st_mode)) {
printf("DIR : %s\n", entry->d_name);
}
}
closedir(dir);
return 0;
}
.log)#include <string.h>
if (strstr(entry->d_name, ".log"))
printf("%s\n", entry->d_name);
if (entry->d_name[0] == '.')
continue;
if (entry->d_type == DT_DIR)
continue;
Linux 没有 readdir 命令,你可能想用的是:
ls
find
# 只看普通文件
find . -maxdepth 1 -type f
# 排除隐藏文件
ls -A
# 只看 .conf 文件
ls *.conf
| 场景 | 做法 |
|---|---|
| C 语言读目录 | opendir + readdir |
| 过滤内容 | 在 while 中判断 |
| 精确类型 | lstat + S_IS* |
| 命令行 | ls / find |
如果你能提供:
我可以直接给你一份 可编译的完整代码。