c++ - boost::exists 表示符号链接(symbolic link)不取消引用

标签 c++ boost

boost::filesystem 中,path 类始终尝试取消引用符号链接(symbolic link)。许多 API 都是为了让符号链接(symbolic link)看起来不可见。我猜他们下面的很多系统调用都与 stat 相关,而不是与 lstat 相关。这对我来说是有问题的,因为我正在尝试获取符号链接(symbolic link)本身。

例如,执行 fs::exists("some_symlink") 因为虽然 some_symlink 存在,但其所指对象不存在。我希望这能让我返回 true,并且在旧版本的 boost 中它支持它:https://www.boost.org/doc/libs/1_32_0/libs/filesystem/doc/operations.htm#symbolic_link_exists

但是,现在不行了。有什么好的办法吗?

最佳答案

您可以使用 boost::filesystem::symlink_status 获取 file_status,然后检查其 type()

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

int main(){
    auto a = boost::filesystem::symlink_status("a_symlink");
    auto b = boost::filesystem::symlink_status("main.cpp");
    auto c = boost::filesystem::symlink_status("not_existing");
    auto d = boost::filesystem::symlink_status("a_broken_symlink");
    std::cout << std::boolalpha
        << (a.type() == boost::filesystem::file_not_found) << " " 
        << (b.type() == boost::filesystem::file_not_found) << " "
        << (c.type() == boost::filesystem::file_not_found) << " "
        << (d.type() == boost::filesystem::file_not_found) << "\n";
}

执行:

$ touch f 
$ ln -s main.cpp a_symlink
$ ln -s f a_broken_symlink
$ rm f 
$ ls -l
total 4
lrwxrwxrwx 1 2001 2000   1 Jun  3 23:33 a_broken_symlink -> f
lrwxrwxrwx 1 2001 2000   8 Jun  3 23:33 a_symlink -> main.cpp
-rw-rw-rw- 1 2001 2000 637 Jun  3 23:33 main.cpp
$ g++ -std=c++14 -Wall -Wextra -pedantic -lboost_filesystem -lboost_system main.cpp && ./a.out
false false true false

Live on Coliru

关于c++ - boost::exists 表示符号链接(symbolic link)不取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50671855/

相关文章:

javascript - 将 Apache Thrift 与 Apache Cordova 相结合

c++ - 如何显示一个字符数字

c++ - Boost的lexical_cast从double到string的精度

c++ - Boost.Beast 速率限制

c++ - 两个类(class)的 friend

c++ - 使用指针数组中对象的函数

c++ - 标准实验锁存器和屏障使用 ptrdiff_t

c++ - 在容器中使用时断言在 boost::intrusive_ptr 中触发

boost - 处理语义 Action 中的异常

C++ Boost asio 错误 : no shared cipher