c - 有没有一种编程方法可以判断符号链接(symbolic link)是否指向 C 中的文件或目录?

标签 c posix symlink

我正在使用 readdir 递归地迭代目录。

struct dirent 已记录 here ,并指出 d_type 可以具有不同的值,包括 DT_LNKDT_DIRDT_REG。 但是,当 d_typeDT_LNK 时,不会提示链接是指向文件还是目录。

有没有办法检查符号链接(symbolic link)的目标是文件还是目录?

最佳答案

dirent 结构可能会告诉您该条目是目录还是符号链接(symbolic link),但某些文件系统在 d_type 中不提供此信息,并将其设置为 DT_UNKNOWN

无论如何,判断符号链接(symbolic link)是否指向目录的最简单方法是通过 stat 系统调用来解析符号链接(symbolic link),如果成功,将填充stat 结构,允许 S_ISDIR 为您提供信息:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int is_directory(const char *path) {
    struct stat st;
    return !stat(path, &st) && S_ISDIR(st.st_mode);
}

请注意以下注意事项:

  • 您必须根据目录名称和条目名称构造路径以传递给 is_directory()
  • 对通过符号链接(symbolic link)链接的目录进行递归可能会导致无限递归,因为符号链接(symbolic link)可能指向父目录或其所在目录本身。

关于c - 有没有一种编程方法可以判断符号链接(symbolic link)是否指向 C 中的文件或目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73000247/

相关文章:

C语言中时间的计算

c - 在 Hp-UX ksh 中执行交互式命令(意外)并获取子进程

node.js - 为什么 Express 在安装时创建 Sym 链接?

单链表上的 C 程序返回错误

awk - 如何使用 POSIX shell 脚本删除文件的特​​定行?

c++ - OSX 缺少 memalign

c - 如果 close(2) 因 EIO 而失败,文件描述符是否仍会被删除?

Linux 符号链接(symbolic link)目录中的所有文件都添加了 '*'

winapi - 如何列出 NTFS 文件系统上的所有符号链接(symbolic link)

c - 按位运算改变值?