C++ 如何使用boost::filesystem检查文件是常规文件还是符号链接?

C++ 如何使用boost::filesystem检查文件是常规文件还是符号链接?,c++,boost,boost-filesystem,C++,Boost,Boost Filesystem,我想检查字符串name是否指我可以打开和读取的文件,因此它可以是常规文件或符号链接 我第一次使用这个: std::ifstream in(name.c_str()); if (!in.is_open()) { // throw exception! } 但是当name引用目录名时,它没有抛出异常 现在我用这个: if (!fs::exists(name) || fs::is_directory(name)) { // throw exception! } 但如果它是指向目录的符号链接

我想检查字符串
name
是否指我可以打开和读取的文件,因此它可以是常规文件或符号链接

我第一次使用这个:

std::ifstream in(name.c_str());
if (!in.is_open()) {
  // throw exception!
}
但是当
name
引用目录名时,它没有抛出异常

现在我用这个:

if (!fs::exists(name) || fs::is_directory(name)) {
  // throw exception!
}
但如果它是指向目录的符号链接,它(大概)不会抛出。这一点也是如此:

if (!fs::is_regular_file(name) && !fs::is_symlink(name)) {
  // throw exception!
}

有更好的方法吗?

从Boost.Filesystem v3开始,检查它是否是常规文件已经满足了您的需要。下面是一个简单的代码:

#include <boost/filesystem.hpp>

#include <iostream>

namespace fs = boost::filesystem;

int main(int argc, char* argv[]) {
  if (argc > 1) {
    auto status = fs::status(argv[1]);

    if (status.type() == fs::regular_file)
      std::cout << argv[1] << " is a valid path." << std::endl;
    else
      std::cout << argv[1] << " is not a valid path." << std::endl;

    if (fs::symlink_status(argv[1]).type() == fs::symlink_file)
      std::cout << "It is also a symlink." << std::endl;

  } else {
    std::cerr << "A path must be given." << std::endl;
  }

  return 0;
}
如您所见,
boost::filesystem::status(path)
返回关于实际路径的信息,无论它是否是符号链接(跟随到实际位置)。另一方面,
boost::filesystem::symlink\u status(path)
返回文件本身是否为symlink的信息

有关更多信息,请访问

% ./fstest /bin # it is a symlink path
/bin is not a valid path.
It is also a symlink.
% ./fstest /bin/ # it is a symlink path but dereferenced? (trailing /)
/bin/ is not a valid path.
% ./fstest /bin/zsoelim # it is a symlink                                                                                                               
/bin/zsoelim is a valid path.
It is also a symlink.
% ./fstest /bin/soelim # it is not a symlink 
/bin/soelim is a valid path.