温馨提示×

linux readdir怎样读取隐藏文件

小樊
48
2026-10-14 11:34:09
栏目: 智能运维

在 Linux 下使用 readdir() 读取目录时,隐藏文件(以 . 开头的文件)本身是可以被读到的,只是很多示例代码会人为跳过它们。下面分几种情况说明。


一、使用 readdir() 读取隐藏文件(最基础)

readdir() 会返回目录中所有条目,包括:

  • 普通文件
  • 目录
  • 隐藏文件(如 .bashrc)
  • . 和 ..

示例代码(C 语言)

#include <stdio.h>
#include <dirent.h>

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;

    if (!dir) {
        perror("opendir");
        return 1;
    }

    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

✅ 这个程序会列出所有文件,包括隐藏文件


二、为什么有时候“读不到”隐藏文件?

常见原因是人为过滤掉了:

if (entry->d_name[0] == '.')
    continue;   // 跳过隐藏文件

如果你不想跳过,直接去掉这个判断即可。


三、只读取隐藏文件

如果你想只处理隐藏文件:

while ((entry = readdir(dir)) != NULL) {
    if (entry->d_name[0] == '.') {
        printf("hidden: %s\n", entry->d_name);
    }
}

⚠️ 注意:. 和 .. 也会被匹配,可用:

if (entry->d_name[0] == '.' &&
    !(entry->d_name[1] == '\0' ||
     (entry->d_name[1] == '.' && entry->d_name[2] == '\0'))) {
    printf("hidden: %s\n", entry->d_name);
}

四、更现代的方法(推荐)

1. scandir()(可过滤)

struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);

for (int i = 0; i < n; i++) {
    printf("%s\n", namelist[i]->d_name);
}

2. getdents()(底层,不常用)

系统调用级,更复杂,一般不用。


五、Shell 对比理解

ls          # 不显示隐藏文件
ls -a       # 显示隐藏文件

readdir() 相当于 ls -a


六、总结

✅ readdir() 默认就能读取隐藏文件
❌ 不是 API 限制,而是代码逻辑过滤
✅ 隐藏文件只是文件名以 . 开头

如果你用的是 C++ / Python / Shell 脚本,我也可以给你对应示例。

0 踩