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

mer*_*011 2 c symlink posix

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

struct dirent记录在此处,并注释d_type可以具有不同的值,包括DT_LNKDT_DIRDT_REG。但是,当d_typeis时DT_LNK,没有提示链接是指向文件还是目录。

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

chq*_*lie 5

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

无论如何,判断符号链接是否指向目录的最简单方法是通过系统stat调用来解析符号链接,如果成功,将填充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);
}
Run Code Online (Sandbox Code Playgroud)

请注意以下注意事项:

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

  • 您可以在“DIR *”上使用“dirfd”来获取目录的 fd,并将其与 dirent 中的“d_*”路径一起使用并传递给“fstatat” (2认同)