在 Linux 下使用 readdir()(来自 <dirent.h>)读取目录时,readdir 本身不会过滤,需要你在代码里手动判断。下面按常见需求给你几种“过滤”方式。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
. 和 ..while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
使用 entry->d_type:
| 类型 | 宏 |
|---|---|
| 普通文件 | DT_REG |
| 目录 | DT_DIR |
| 符号链接 | DT_LNK |
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
printf("文件: %s\n", entry->d_name);
}
}
⚠️ 注意:
某些文件系统(如 NFS)d_type 可能是 DT_UNKNOWN,此时需用 stat()。
stat() 精确过滤(最可靠)#include <sys/stat.h>
struct stat st;
char path[256];
while ((entry = readdir(dir)) != NULL) {
snprintf(path, sizeof(path), "./%s", entry->d_name);
stat(path, &st);
if (S_ISREG(st.st_mode)) {
printf("普通文件: %s\n", entry->d_name);
}
}
while ((entry = readdir(dir)) != NULL) {
if (strstr(entry->d_name, ".txt"))
printf("%s\n", entry->d_name);
}
可用 regex.h:
#include <regex.h>
regex_t reg;
regcomp(®, ".*\\.log$", REG_EXTENDED);
while ((entry = readdir(dir)) != NULL) {
if (!regexec(®, entry->d_name, 0, NULL, 0))
printf("%s\n", entry->d_name);
}
regfree(®);
| 需求 | 方法 |
|---|---|
跳过 . .. |
字符串比较 |
| 文件 / 目录 | d_type |
| 精确类型 | stat() |
| 文件名规则 | strstr / regex |
如果你有 具体过滤条件(比如“只要 .c 文件”“排除隐藏文件”“递归子目录”),可以直接告诉我,我给你写完整示例。