在 Linux 下使用 readdir() 读取目录时,符号链接(软链接)的处理方式取决于链接本身位于哪里,而不是它指向什么。
下面分情况说明。
readdir() 读取目录时遇到符号链接如果目录里有:
file.txt
link_to_file -> file.txt
subdir/
link_to_dir -> subdir/
readdir() 会照常返回这些链接项,并且:
struct dirent 中的 d_type 通常为:
DT_LNK(符号链接)示例:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_LNK) {
printf("symbolic link: %s\n", entry->d_name);
}
}
✅ 此时 readdir() 不会进入链接指向的目录
opendir() 打开一个符号链接目录DIR *dir = opendir("link_to_dir");
opendir() 会跟随符号链接readdir() 读取的是目标目录内容等价于:
cd link_to_dir
ls
⚠️ 如果链接失效(悬空链接),opendir() 返回 NULL
readdir()lstat() 判断struct stat st;
lstat(entry->d_name, &st);
if (S_ISLNK(st.st_mode)) {
// 是符号链接
}
stat()opendir() / open()(自动跟随)if (entry->d_type == DT_DIR) {
// 普通目录
} else if (entry->d_type == DT_LNK) {
// 可选:是否跟随
}
⚠️ 注意:
d_type 在某些文件系统上可能是 DT_UNKNOWNlstat()| 类型 | readdir 表现 |
|---|---|
| 硬链接 | 与普通文件无异 |
| 符号链接 | DT_LNK |
readdir() 无法区分硬链接
readdir()会把符号链接当作普通目录项返回,不会自动进入链接指向的目标;是否跟随由你调用stat/opendir决定。
如果你有:
readdir_r / getdents可以继续问,我可以给完整示例。