C / C ++相当于Bash" readlink -f"

时间:2018-01-05 12:32:20

标签: c++ c linux bash

我用C / C ++编写Linux工具代码并接收目录作为输入的完整路径,这将始终以" /"为根。但路径的元素可能是符号链接而不是真实的目录。例如: /工具/ sometool /最新 哪里"最新"是" 1.0"。

的符号链接

然后,该路径用于过滤其他文件的列表。我的问题是其他文件可以使用任何一种形式: /tools/sometool/latest/foo.txt /tools/sometool/1.0/foo.txt 我需要将两者都视为匹配/ tools / sometool / latest中包含的标准。因此,我需要一种方法来完全解析路径中的所有符号链接。

在Bash," readlink -f / tools / sometool / latest"返回" /tools/sometool/1.0"这是完美的,但当我尝试" readlink()"在C中,它只是给了我" 1.0"。 我已搜索但无法在C中找到任何现有解决方案。 是否有一个我错过的简单解决方案,或者我是否需要在C中构建等效的bash命令才能使其工作?

谢谢!

P.S。该工具不需要是可移植的,因此只支持Linux的解决方案就可以了。

2 个答案:

答案 0 :(得分:1)

如果您使用的是C ++ 17,则可以尝试std::filesystem::canonical

  

将路径p转换为规范绝对路径,即在其通用格式表示中没有点,点点元素或符号链接的绝对路径。

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;
int main()
{
    fs::path p = fs::path("/tools/sometool/latest");
    std::cout << "Canonical path for " << p << " is " << fs::canonical(p) << '\n';
}

答案 1 :(得分:1)

尝试realpath()(请参阅its man page)。这与readlink -f基本相同。