【问题标题】:Determine the type of directory entry a link points to确定链接指向的目录条目的类型
【发布时间】:2016-04-28 22:12:06
【问题描述】:

我只想阅读子目录和指向子目录的链接。 使用以下代码,我读取了所有子目录和链接。

struct dirent* de;
DIR* dir = opendir(c_str());
if (!dir) { /* error handling */ }

while (NULL != (de = readdir(dir))) {
    if (de->d_type != DT_DIR && de->d_type != DT_LNK)
        continue;
    // Do something with subdirectory
 }

但是如何检查链接是否也指向子目录?我不想阅读整个链接目录来执行此操作。

【问题讨论】:

  • 出于什么目的你用 C 和 C++ 标记这个?
  • 您在寻找 readlink 吗? linux.die.net/man/3/readlink
  • readlink 获取指向的东西的路径,stat 用于检查它是否是一个目录?
  • 在递归遍历时通常会忽略指向目录的符号链接,因为存在重复计数甚至无限循环的危险。 (好吧,实际上并不是无限的,因为 ENAMETOOLONGELOOP。)

标签: c linux


【解决方案1】:

您可以使用<sys/stat.h> 中名为stat 的函数:

struct dirent* de;
struct stat s;
DIR* dir = opendir(c_str());
if (!dir) { /* error handling */ }

while (NULL != (de = readdir(dir))) {
    if (de->d_type != DT_DIR) {
        char filename[256];
        sprintf(filename, "%s/%s", c_str(), de->d_name);
        if (stat(filename, &s) < 0)
            continue;
        if (!S_ISDIR(s.st_mode))
            continue;
    }
    // Do something with subdirectory
}

【讨论】:

  • @Th.Thielemann:如果de-&gt;d_typeDT_UNKNOWN,则无论如何您都需要使用stat,或者您正在编译的系统甚至不提供d_type 字段struct dirent。这是一个真正的问题,因为它仍然是 XFS 文件系统的一个新特性。它需要最新格式的磁盘元数据,以及元数据 CRC,这还不是默认设置。 mkfs.xfs 的默认值为 -n ftype=0,因此即使是新安装的新创建的 XFS 文件系统也不支持它,除非管理员手动选择启用该选项。
  • 您仍然可以利用d_type 来避免stat() 使用符号链接以外的任何内容(可能指向目录,也可能不指向目录)。
  • char filename[256]; 然后sprintf() 进入那个缓冲区?这是缓冲区溢出的秘诀。
  • 没错,但答案是关于stat函数。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多