c++ - 使用 boost 文件系统查找循环符号链接(symbolic link)

标签 c++ boost symlink boost-filesystem

我的程序正在递归地遍历项目目录,其中可能会出现循环符号链接(symbolic link),从而在算法的另一个步骤中引发异常(符号链接(symbolic link)级别过多)。我想找到循环符号链接(symbolic link)来避免此类异常。 (不幸的是,通过删除循环符号链接(symbolic link)来修复项目并不是一个选择。)

有没有办法使用 boost::filesystem 发现循环符号链接(symbolic link)?我已经考虑过使用 read_symlink() 解析符号链接(symbolic link),并在符号链接(symbolic link)解析为另一个符号链接(symbolic link)时以递归方式继续,但这并不完全是最佳解决方案。

最佳答案

您应该能够使用boost::filesystem::canonicalweakly_canonical (如果文件不需要存在)。

请注意,许多符号链接(symbolic link)和许多路径元素可能会产生性能开销,因为路径元素是stat-ed,构建一个新的路径实例。

<强> Live On Coliru

#include <boost/filesystem.hpp>
#include <iostream>

int main(int argc, char** argv) {
    using namespace boost::filesystem;
    for (path link : std::vector(argv+1, argv+argc)) {
        boost::system::error_code ec;
        auto target = canonical(link, ec);
        if (ec) {
            std::cerr << link << " -> " << ec.message() << "\n";
        } else {
            std::cout << link << " -> " << target << "\n";
        }

        if (ec) {
            target = weakly_canonical(link, ec);
            if (!ec) {
                std::cerr << " -- weakly: -> " << target << "\n";
            }
        }
    }
}

当创建一些不同质量的符号链接(symbolic link)时:

ln -sf main.cpp a
ln -sf b b
ln -sf d c

a b c d将其煮焦:

"a" -> "/tmp/1613746951-1110913523/main.cpp"
"b" -> Too many levels of symbolic links
"c" -> No such file or directory
 -- weakly: -> "c"
"d" -> No such file or directory
 -- weakly: -> "d"

关于c++ - 使用 boost 文件系统查找循环符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66275694/

相关文章:

c++ - C 风格的字符串安全吗?

c++ - 我怎样才能简单地使用无法识别的字符?

ant - 如何在输出 .tar.gz 文件中创建符号链接(symbolic link)?

macos - 如何判断来自 "ls"的目录是否是符号链接(symbolic link)?

bash - 用原始符号替换所有符号链接(symbolic link)

c++ - 从周数和年份开始的月份

c++ - 父类有一个虚函数。父类中必须要有虚析构函数吗?

c++ - 将 Clang -fsyntax-only 模式与静态库一起使用?

C++ boost::spirit 解析嵌入式语言

c++ - 最大尺寸的 async_read()