在 CentOS(Linux) 下,readdir 本身不会过滤目录项,它只是把目录里的所有内容(包括 . 和 ..、隐藏文件等)原样返回。
过滤需要在调用 readdir 后自己处理,或者在 shell / 应用层做。
下面分几种常见情况说明。
readdir() 过滤(最常见). 和 ..)#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 过滤 . 和 ..
if (entry->d_name[0] == '.')
continue;
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ 效果:不显示隐藏文件和 . / ..
#include <sys/stat.h>
if (entry->d_type == DT_REG) {
printf("file: %s\n", entry->d_name);
}
常见 d_type:
DT_REG:普通文件DT_DIR:目录DT_LNK:符号链接⚠️ 注意:d_type 在某些文件系统(如 NFS)上可能不可用,此时需要用 lstat()。
.log)#include <string.h>
if (strstr(entry->d_name, ".log") == NULL)
continue;
scandir()(推荐,支持过滤函数)scandir() 原生支持过滤,比 readdir 更方便。
#include <stdio.h>
#include <dirent.h>
int filter(const struct dirent *entry) {
return entry->d_name[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);
}
✅ 优点:
ls 过滤ls -p | grep -v /
# 只显示文件(排除目录)
ls .*
# 只看隐藏文件
find 过滤(推荐)find . -maxdepth 1 -type f
find . -maxdepth 1 -name "*.log"
| 需求 | 方法 |
|---|---|
| 排除隐藏文件 | d_name[0] != '.' |
| 只要普通文件 | d_type == DT_REG |
| 只要目录 | d_type == DT_DIR |
| 后缀过滤 | strstr() / fnmatch() |
| 排序 | scandir() |
| Shell 使用 | find / ls |
scandir()(更安全、方便)readdir() + 手动过滤find如果你能说明 语言(C / C++ / Python / Shell) 或 具体过滤规则(如“排除目录 + 只看 .conf 文件”),我可以给你更精确的示例。