在 Debian(以及所有类 Unix 系统)里,readdir() 本身不能“过滤”文件,它只是逐个返回目录里的所有条目(包括文件、子目录、符号链接等)。
如果你想要“只读取某些文件”,一般有以下几种做法:
readdir() + 手动过滤(最常见)在用户态判断文件名或类型:
#include <dirent.h>
#include <string.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (strncmp(entry->d_name, ".", 1) == 0) // 跳过隐藏文件
continue;
if (entry->d_type == DT_REG) // 只处理普通文件
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ readdir() 返回所有内容
❌ 过滤逻辑由你自己写
scandir()(带过滤函数)这是 readdir 的“增强版”,支持过滤 + 排序:
#include <dirent.h>
#include <stdio.h>
int filter(const struct dirent *d) {
return strncmp(d->d_name, ".", 1) != 0;
}
int main() {
struct dirent **namelist;
int n = scandir(".", &namelist, filter, alphasort);
for (int i = 0; i < n; i++) {
printf("%s\n", namelist[i]->d_name);
free(namelist[i]);
}
free(namelist);
}
✅ 直接支持过滤函数
✅ 使用更方便
glob()(按通配符过滤)适合“*.txt”这种需求:
#include <glob.h>
#include <stdio.h>
int main() {
glob_t g;
glob("*.txt", 0, NULL, &g);
for (int i = 0; i < g.gl_pathc; i++)
printf("%s\n", g.gl_pathv[i]);
globfree(&g);
}
✅ 支持 shell 风格通配符
❌ 不是基于 readdir
不能在 readdir 系统调用层面直接过滤
(Linux 没有“只返回 .txt”的 readdir 接口)
| 方法 | 是否能过滤 | 说明 |
|---|---|---|
readdir() |
❌ | 返回全部,自己过滤 |
scandir() |
✅ | 提供 filter 函数 |
glob() |
✅ | 通配符过滤 |
| 内核 | ❌ | 不支持 |
如果你能说下是 C / C++ / Shell / Python,我可以给你更具体的例子。